我想使用自签名证书(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

在我的dev的机器,它加载确定。 因为我需要一个私钥访问(CER文件加载好了)我加载* .PFX不是* .CER文件的原因。

:我对我的开发mochine这样做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>
makecert的

我使用的版本v5.131.3790.0

有帮助吗?

解决方案

使用本地计算机存储私钥:

X509Certificate2 cert = new X509Certificate2("myhost.pfx", "pass",
    X509KeyStorageFlags.MachineKeySet);

MachineKeySet 被描述为“私有密钥存储在本地计算机存储,而不是当前用户存储”。没有标志默认为用户存储的地方。

即使你是从磁盘读取证书,并将其存储在私有密钥仍然存储在Microsoft加密API加密服务提供关键数据库中的对象。在托管服务器的ASP.NET进程没有权限访问用户商店。

另一种方法(如按照下面一些评论)是修改IIS配置或应用程序池身份 - 这做的工作。然而,这种假定有访问这些配置项可以不是的情况下(例如,在共享托管环境中)。

其他提示

我试图将其更改为MachineKeySet的Randy的解决方案,但然后得到的错误消息:

“键不是有效的在指定状态下使用”

所以,过了一小周围的Googling我发现,建议其更改为一个帖子:

var certificate = new X509Certificate2(certKeyFilePath, passCode, 
X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet |       
X509KeyStorageFlags.PersistKeySet );

和整理出了这我的问题。

我还没有尝试过的建议改变IIS配置的设置应用程序池设置。要做到这一点去的高级设置为您的网站的应用程序池然后设置“加载用户配置文件”为真。当此设定为假,则密钥容器是不可访问的明显。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top