c# – 证书私钥在IIS Web服务器下抛出CryptographicException

在我的ASP.NET应用程序中,我正在从证书存储区加载证书:

var myCert = CertificateUtils.GetCertificate("thumbprint");

此证书包含一个密钥对,用于解密加密的应用程序设置.

证书安装在本地计算机下的个人证书存储中.当应用程序在IIS Express下运行时,它运行良好.但是如果我在完整的IIS Web服务器下执行它,则myCert实例缺少私钥.

myCert对象的PrivateKey字段包含一个异常:

'myCert.PrivateKey' threw an exception of type 'System.Security.Cryptography.CryptographicException'

我已经检查过myCert对象的其他字段包含相同的值(例如,证书序列号,指纹或过期),因此它似乎在IIS和IIS Express下获得相同的证书.在完整IIS的情况下,仅缺少私钥.

我唯一改变的是项目属性中的本地开发服务器(“使用IIE Express”/“使用IIS Web服务器”).它在两种情况下都在Azure Emulator Express中运行.

有没有人有想法,为什么会这样?

最佳答案
在IIS Express上运行,程序使用您的凭据访问证书,而在IIS上使用池身份的凭据.您可以轻松检查证书ACL以查看是否允许.

跟着这些步骤:

>检查您的网站使用的应用程序池

打开Internet信息服务管理器,在左侧的“连接”树中选择“站点”.在中间面板中选择您的站点,然后单击右侧面板上“操作”下的“基本设置”.
>检查应用程序池使用的标识

在左侧的Connections树中选择Application Pools,然后在中间面板中找到标识.它可能是“网络服务”.
>将应用程序池使用的标识的读取权限添加到证书中

打开Microsoft管理控制台(mmc),为本地计算机帐户添加“证书”管理单元,并在“个人证书”下找到您的证书.打开其上下文菜单,“所有任务”和“管理私钥”….单击“添加…”,输入标识(“网络服务”),然后单击“检查名称”和“确定”.在权限下,仅允许读取权限.

您可以在此问题中阅读详细信息:How to give ASP.NET access to a private key in a certificate in the certificate store?

转载注明原文:c# – 证书私钥在IIS Web服务器下抛出CryptographicException - 代码日志