1

私のWCFプッシュ通知サービスに問題があります。 Appleにプッシュ通知を送信するたびに、新しいRSAが "C:¥ProgramData¥Microsoft¥Crypto¥RSA¥MachineKeys"フォルダ内に生成されます。 私はこれを引き起こしている問題がアップルのp12証明書に関係していると思います。AppleへのPushSharpの通知により、サーバー上に一時的なRSAファイルが生成される

どうしてですか?これらのRSAの生成を防ぐ方法はありますか?

私はPushSharpライブラリを使用していますし、私のコードは次のようになります。

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

答えて

1

のための完璧な仕事の一時ファイルです。

ファイルが表示された場合は消えます(「一時ファイル」と呼ばれています)ので、すべて正常に機能しています。それが永久に現れている場合、PushSharpは証明書をPersistKeySetでロードしています。これは、秘密鍵が削除されるべきではないことを示します。

https://github.com/has-taiar/PushSharp.Web/blob/master/PushSharp.Apple/ApplePushChannelSettings.csがApplePushChannelSettingsの実際のソースであるかどうかわかりませんが、それはできます。そのソースを見ると、彼らはPersistKeySetを使用しているように見えます。

次の2つの実用的なアプローチがあります。

1)あなたが店の永続性のために必要があるため、負荷にPersistKeySetを使用して(1回の操作としてX509Storeに証明書をロードします)。ファイルは永久になりますが、永遠に使用されるので、すばらしいです。

2)PFXから自分で証明書をロードし、完了したら証明書を廃棄するのが理想的です。より安全に使用できるシャットダウン通知があるかどうかは分かりませんが、cert.Dispose()(または古いフレームワークバージョンの場合はcert.Close())を呼び出すと、GCとFinalizerを待つよりも信頼性が高くなりますあなたのために清掃をしてください。

あなたは良いシャットダウンイベント持たない場合:いない場合は

// 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(); 

を:

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

どんなにあなたはまだ永久に漏洩したファイルを使用して、プロセスが異常終了するたびに終わるだろう何ファイル削除コードはキックインする機会を得ることができないからです。

一時ファイルの作成を完全に避けるための解決方法があります。それは、EphemeralKe .NET Core 2.0に追加されたySetフラグ(現在プレビュー中)。まだ.NET Frameworkでは利用できません。

// 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)); 

しかし、プッシュシャープが.NETコアで利用できるかどうかわかりません。

0

私は同じ問題を抱えていたと私は解決策 鍵生成、新しいプッシュ通知を送信するたびに防止した、 コードこのようにすべきです。 Windowsは、それがappleCert PFXブロブの外にロードされたことをRSA秘密鍵を入れているところと、それは私

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

'PersistKeySet'を指定すると、コンストラクタを実行するたびにファイルがディスクに永久に保持されます。また、必要がない限り、 'Exportable'を設定しないでください。 – bartonjs

関連する問題