PushSharp 通知 Apple 在服务器上生成临时 RSA 文件

PushSharp's notification to Apple generate temp RSA files on server

我的 WCF 推送通知服务有问题。 每次它向苹果发送推送通知时,都会在 "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys" 文件夹中生成一个新的 RSA。 我认为导致此问题的问题可能与Apple p12证书有关。

为什么会这样?有什么办法可以防止生成那些 RSA?

我正在使用 PushSharp 库,我的代码如下所示:

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

我遇到了同样的问题,我找到了解决方案 防止每次发送新推送通知时都生成密钥, 代码应该是这样的。它非常适合我

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

临时文件是 Windows 放置从 appleCert PFX blob 加载的 RSA 私钥的地方。

如果文件出现,然后消失(因为您称它为 "temp" 文件),则一切正常。如果它出现并永远存在,则 PushSharp 正在使用 PersistKeySet 加载证书,这表示不应删除私钥。

我不知道 https://github.com/has-taiar/PushSharp.Web/blob/master/PushSharp.Apple/ApplePushChannelSettings.cs 是否是 ApplePushChannelSettings 的真正来源,但它可以。查看该来源,他们似乎正在使用 PersistKeySet,使文件永久化。

你有两个实用的方法:

1) 将证书作为一次性操作加载到 X509Store 中(在加载时使用 PersistKeySet,因为您需要存储持久性)。该文件成为永久文件,但会永久使用,所以很酷。

2) 自行从 PFX 加载证书并(理想情况下)在完成后处置证书。我不知道您是否有任何可以或多或少可靠使用的关机通知,但是调用 cert.Dispose()(或者,在较旧的 Framework 版本上,cert.Close())更可靠而不是等待 GC 和终结器为您进行清理。

如果您确实有一个好的关机事件:

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

无论如何,每次您的进程异常终止时,您仍然会得到一个永久泄露的文件,因为文件删除代码没有机会启动。

存在一种完全避免创建临时文件的解决方案,那就是使用添加到 .NET Core 2.0(目前处于预览阶段)的 EphemeralKeySet 标志。它在 .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));

但我不知道 PushSharp 是否可用于 .NET Core。