1

Ich habe ein Problem mit meinem WCF-Push-Benachrichtigungsdienst. Jedes Mal, wenn eine Push-Benachrichtigung an Apple gesendet wird, wird im Ordner "C: \ ProgramData \ Microsoft \ Crypto \ RSA \ MachineKeys" ein neuer RSA generiert. Ich denke, dass das Problem, das dies verursacht, mit dem Apple p12-Zertifikat zusammenhängen könnte.PushSharps Benachrichtigung an Apple generiert temporäre RSA-Dateien auf Server

Warum passiert das? Gibt es eine Möglichkeit, die Erzeugung dieser RSA zu verhindern?

I PushSharp Bibliothek und meinen Code bin mit wie folgt aussieht:

pushBroker = new PushBroker(); 
pushBroker.RegisterAppleService(
    new PushSharp.Apple.ApplePushChannelSettings(false, appleCert, p12Pass, false) 
    , null); 

Antwort

1

Die temporäre Datei ist, wo Windows den privaten RSA-Schlüssel gesetzt hat, dass sie geladen aus dem appleCert PFX Blob.

Wenn die Datei erscheint, dann verschwindet (da Sie es eine "Temp" -Datei genannt), dann funktioniert alles wie erwartet. Wenn es erscheint und für immer bleibt, lädt PushSharp das Zertifikat mit PersistKeySet, das besagt, dass der private Schlüssel nicht gelöscht werden soll.

Ich weiß nicht, ob https://github.com/has-taiar/PushSharp.Web/blob/master/PushSharp.Apple/ApplePushChannelSettings.cs die echte Quelle von ApplePushChannelSettings ist, aber es wird. Wenn Sie diese Quelle betrachten, scheinen sie PersistKeySet zu verwenden, um die Datei dauerhaft zu machen.

Sie haben zwei praktische Ansätze:

1) Legen Sie das Zertifikat in eine X509Store als einmaliger Vorgang (mit PersistKeySet auf Last, weil Sie für Speicher Ausdauer benötigen). Die Datei wird permanent, aber sie wird für immer verwendet, also ist es cool.

2) Laden Sie das Zertifikat selbst aus dem PFX und (idealerweise) Entsorgen Sie das Zertifikat, wenn Sie fertig sind. Ich weiß nicht, ob Sie eine Art von Shutdown-Benachrichtigung haben, die Sie mehr oder weniger zuverlässig verwenden können, aber cert.Dispose() (oder, bei älteren Framework-Versionen, cert.Close()) ist zuverlässiger als Warten auf den GC und Finalizer mach die Reinigung für dich.

Wenn Sie machen ein gutes Shutdown-Ereignis:

// Note that I'm not specifying any X509KeyStorageFlags here. 
// You don't want it PersistKeySet (that's the whole point) and you don't 
// need it to be exportable (unless you get exceptions without Exportable, in which case 
// PushSharp is doing something naughty). 
private X509Certificate _cert = new X509Certificate2(appleCert, p12CerPass); 

... 
_broker.RegisterAppleService(new PushSharp.Apple.ApplePushChannelSettings(_cert, false)); 


... 
// In some OnShutdown type location 
_cert.Dispose(); 

Falls nicht:

// Still don't specify any load flags. Especially not PersistKeySet. 
var cert = new X509Certificate2(appleCert, p12CerPass); 
_broker.RegisterAppleService(new PushSharp.Apple.ApplePushChannelSettings(cert, false)); 

Egal, was Sie noch mit einer permanent durchgesickert Datei Sie jedes Mal Prozess nicht normal beendet am Ende dann , da der Code zum Löschen von Dateien keine Chance hat, sich einzuloggen.

Es gibt eine Lösung, die das Erstellen der temporären Datei vollständig vermeidet, und zwar die EphemeralKe ySet-Flag, das zu .NET Core 2.0 hinzugefügt wurde (derzeit in der Vorschau). Es ist noch nicht in .NET Framework verfügbar.

// Keep the private key in memory, never let it touch the hard drive. 
var cert = new X509Certificate2(appleCert, p12CerPass, X509KeyStorageFlags.EphemeralKeySet); 
_broker.RegisterAppleService(new PushSharp.Apple.ApplePushChannelSettings(cert, false)); 

Aber ich weiß nicht, ob PushSharp für .NET Core verfügbar ist.

0

hatte ich das gleiche Problem, und ich fand die Lösung zu verhindern Schlüssel zu erzeugen jedes Mal, wenn neue Push-Benachrichtigung senden, der Code sollte so sein. und es perfekt für mich arbeiten

var cert = X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable; 
var certificate1 = new X509Certificate2(appleCert, p12CerPass,cert); 
_broker.RegisterAppleService(new PushSharp.Apple.ApplePushChannelSettings(certificate1, false)); 
+0

Durch Angabe von 'PersistKeySet' behalten Sie die Datei bei jeder Ausführung des Konstruktors dauerhaft auf der Festplatte.Und Sie sollten nicht "Exportierbar" festlegen, es sei denn Sie müssen. – bartonjs

Verwandte Themen