证书私钥在IIS Web服务器下引发CryptographicException

时间:2015-10-07 21:26:32

标签: c# asp.net iis iis-express

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

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

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

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

PrivateKey对象的myCert字段包含例外:

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

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

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

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

2 个答案:

答案 0 :(得分:6)

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

请按照以下步骤操作:

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

    打开 Internet信息服务管理器,在左侧的 Connections 树中选择 Sites 。在中间面板中选择您的站点,然后单击右侧面板上操作下的基本设置

  2. 检查应用程序池使用的标识

    在左侧的 Connections 树中选择应用程序池,然后在中间面板中找到该标识。它可能是"网络服务"。

  3. 将应用程序池使用的身份的读取权限添加到证书中

    打开 Microsoft管理控制台mmc),为本地计算机帐户添加证书管理单元,并在 Personal <下找到您的证书/ em>证书。打开其上下文菜单,所有任务管理私钥...... 。单击添加.. ,输入标识(&#34; NETWORK SERVICE&#34;)并单击检查名称确定。在 的权限下仅允许读取权限。

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

答案 1 :(得分:0)

我遇到了这个问题来调试应用程序&#34; .PrivateKey&#39;抛出了类型&System; Security.Security.Cryptography.CryptographicException&#34; 我这样解决:

在mmc中>本地计算机&gt;个人&gt;证书&gt;右键单击证书&gt;所有任务&gt;管理私钥: 添加&#34;每个人&#34;用户并选择总控制。