X509Certificate2 使 IIS 崩溃

Posted

技术标签:

【中文标题】X509Certificate2 使 IIS 崩溃【英文标题】:X509Certificate2 makes IIS crash 【发布时间】:2013-02-06 20:35:11 【问题描述】:

当更新X509Certificate2(string, string) 的实例时,我的 IIS 进程简单地崩溃了。没有 .Net 异常,什么都没有,除了我的事件日志中的这个

Faulting application name: w3wp.exe, version: 8.0.9200.16384, time stamp: 0x50108835
Faulting module name: ntdll.dll, version: 6.2.9200.16420, time stamp: 0x505ab405
Exception code: 0xc0000374
Fault offset: 0x00000000000ea485
Faulting process id: 0x102c
Faulting application start time: 0x01ce10301e250c4d
Faulting application path: c:\windows\system32\inetsrv\w3wp.exe
Faulting module path: C:\Windows\SYSTEM32\ntdll.dll
Report Id: 5e55321c-7c23-11e2-93f9-00155d8a0f17
Faulting package full name: 

我很震惊,不知道从哪里开始寻找。将调试器附加到进程时,我可以中断这一行,但是当跨过它时,整个事情都会崩溃。

_certificate = new X509Certificate2(pfxFile, pfxPassword);

pfxFile 是一个有效路径,如果我更改它,我会立即得到一个正确的 .Net PathNotFound 异常。

服务器是 Windows 2012,运行 IIS8 和 .Net 4.5。

更新 This article 描述了相同的问题,解决方案是确保应用程序池身份启用LoadUserProfile

【问题讨论】:

FWIW, ***.com/questions/9259581/… 可能是朝着正确方向迈出的一步。 【参考方案1】:

我也遇到了类似的问题,在 Windows Server 2012 上,使用时 IIS 崩溃了

new X509Certificate2(fileName, keyPassword, X509KeyStorageFlags.Exportable)

已通过将构造函数更改为

来解决此问题
new X509Certificate2(fileName, keyPassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable)

【讨论】:

我遇到了完全相同的问题,您的解决方案也对我有用。我希望我能不止一次地支持这个答案。非常感谢! @RodrigoSieiro 我会继续帮助你解决这个问题。当您使用 Google Admin SDK 服务帐户时,我自己也遇到了这个问题。 @maxp 这个答案就是我喜欢堆栈溢出的原因。 这太不可思议了。由于这个问题使我的应用程序池崩溃,我不得不在我的代码中使用硬编码的跟踪语句来找出错误发生的位置。但这引出了一个问题,为什么会出现这个问题以及改进的构造函数如何解决它?问题3 是,这对我来说非常可怕,为什么这会导致应用程序池崩溃?我完全不喜欢我现在因为使用 X509Certificate2 而感到多么脆弱! 这对我有用,但是当我现在尝试访问 PrivateKey 时,它会引发异常“在 mscorlib.dll 中发生‘System.Security.Cryptography.CryptographicException’类型的异常,但未在用户中处理代码附加信息:指定的提供程序类型无效。"

以上是关于X509Certificate2 使 IIS 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

关于 X509Certificate2 找到文件路径的问题

关于 X509Certificate2 找到文件路径的问题

.NET 中的 X509Certificate2 和 X509Certificate 有啥区别?

如何在.net 中创建一个全新的 x509Certificate2?

从 x509Certificate2 启动 RSACryptoServiceProvider 的最佳方式?

我应该处理 X509Certificate2 吗?