“发生了内部错误。”使用 X509Certificate2 加载 pfx 文件时
Posted
技术标签:
【中文标题】“发生了内部错误。”使用 X509Certificate2 加载 pfx 文件时【英文标题】:"An internal error occurred." when loading pfx file with X509Certificate2 【发布时间】:2010-11-23 15:14:04 【问题描述】:我正在尝试使用自签名证书 (c#):
X509Certificate2 cert = new X509Certificate2(
Server.MapPath("~/App_Data/myhost.pfx"), "pass");
在共享网络托管服务器上,我收到错误:
System.Security.Cryptography.CryptographicException: An internal error occurred.
堆栈跟踪以
结尾System.Security.Cryptography.CryptographicException.
ThrowCryptogaphicException(Int32 hr) +33
System.Security.Cryptography.X509Certificates.X509Utils.
_LoadCertFromFile(String fileName, IntPtr password, UInt32 dwFlags,
Boolean persistKeySet, SafeCertContextHandle& pCertCtx) +0
System.Security.Cryptography.X509Certificates.X509Certificate.
LoadCertificateFromFile(String fileName, Object password,
X509KeyStorageFlags keyStorageFlags) +237
System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(
String fileName, String password) +131
在我的开发机器上加载正常。 我加载 *.pfx 而不是 *.cer 文件的原因是因为我需要访问私钥(cer 文件加载正常)。 我像这样在我的开发机器上制作了 pfx:
makecert -r -n "CN=myhost.com, E=admin@myhost.com" -sky exchange -b 01/01/2009
-pe -sv myhost.pvk myhost.cer
<b>pvk2pfx</b> -pvk myhost.pvk -spc myhost.cer -pfx myhost.pfx -po pass</code>
我正在使用 v5.131.3790.0 的 makecert 版本
【问题讨论】:
或许这篇文章能帮上忙:codeproject.com/KB/WCF/wcfcertificates.aspx 我收到了错误消息the system cannot find the file specified
。 @Randy Levy 的答案对我有用!
【参考方案1】:
我尝试了 Randy 将其更改为 MachineKeySet 的解决方案,但随后收到错误消息:
“密钥在指定状态下无效”
所以在谷歌搜索了一下之后,我发现了一个帖子,建议将其更改为:
var certificate = new X509Certificate2(certKeyFilePath, passCode,
X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet |
X509KeyStorageFlags.PersistKeySet );
这解决了我的问题。
我还没有尝试在 IIS 配置中更改设置应用程序池设置的建议。为此,请转到您网站应用程序池的高级设置,然后将“加载用户配置文件”设置为 true。当此设置为 false 时,显然无法访问密钥容器。
【讨论】:
我收到了上述错误,您的解决方案已帮助解决它。谢谢。 我不喜欢没有帮助的 cmets(比如这个),但让我告诉你,你拯救了我的一天。谢谢!【参考方案2】:使用本地计算机存储获取私钥:
X509Certificate2 cert = new X509Certificate2("myhost.pfx", "pass",
X509KeyStorageFlags.MachineKeySet);
MachineKeySet
被描述为“私钥存储在本地计算机存储中,而不是当前用户存储中”。没有标志的默认设置是放置在用户存储中。
即使您从磁盘读取证书并将其存储在对象中,私钥仍存储在 Microsoft Cryptographic API Cryptographic Service Provider 密钥数据库中。在托管服务器上,ASP.NET 进程无权访问用户存储。
另一种方法(根据下面的一些 cmets)是修改 IIS 配置或应用程序池标识——它们确实有效。但是,这假设可以访问这些配置项,但情况可能并非如此(例如,在共享主机环境中)。
【讨论】:
是的,它有帮助,谢谢。你能解释一下为什么吗?文档说没有任何帮助。 你拯救了我的一天。奇怪的是,在将解决方案升级到 .NET 4.0 之前,它在我的机器上运行 确实,只需设置 X509KeyStorageFlags.MachineKeySet 参数即可。抛出的异常只是说明“发生了内部错误”,这真的很可悲。不是很有帮助。 您还可以将更多的私钥权限添加到分配给应用程序池的帐户。或者将应用池标识更改为“本地服务”。 为了更快的修复/解决方法检查:***.com/questions/9951729/…以上是关于“发生了内部错误。”使用 X509Certificate2 加载 pfx 文件时的主要内容,如果未能解决你的问题,请参考以下文章
使用充气桥X509v3CertificateBuilder生成X509证书