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

标签 c# apple-push-notifications rsa windows-server-2008-r2 pushsharp

我的 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);

最佳答案

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

如果该文件出现,然后消失(因为您将其称为“临时”文件),那么一切都会按预期工作。如果它出现并永远保留,则 PushSharp 正在使用 PersistKeySet 加载证书,这表示不应删除私钥。

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

您有两种实用的方法:

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

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

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

有一个解决方案可以完全避免创建临时文件,那就是使用添加到 .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。

关于c# - PushSharp 通知 Apple 在服务器上生成临时 RSA 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44429544/

相关文章:

C#:从列表填充列表框的最简单方法

c# - 不支持图像的给定路径格式

javascript - Safari 推送请求权限在 SAFARI 10.0.1 中返回 "denied"

c# - RSA:如何在 java 中生成私钥并在 C# 中使用它?

iphone - 从 key 链中的 key 对中提取公钥

c - 如何将 pem 公钥转换为 openssl RSA* 结构

c# - 使用 C# 在 WPF 中更改背景图像

c# - 在浏览器中打开 PDF 而不是下载它

ios - 将Array的SN中的null发送到Apple Wallet是否正确?

ios - 如何显示 iOS 推送通知弹出窗口?