在我的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 中运行。
有没有人有想法,为什么会这样?
答案 0 :(得分:6)
在IIS Express上运行,程序使用您的凭据访问证书,而在IIS上使用池身份的凭据。您可以轻松检查证书ACL以查看是否允许谁。
请按照以下步骤操作:
检查您的网站使用的应用程序池
打开 Internet信息服务管理器,在左侧的 Connections 树中选择 Sites 。在中间面板中选择您的站点,然后单击右侧面板上操作下的基本设置。
检查应用程序池使用的标识
在左侧的 Connections 树中选择应用程序池,然后在中间面板中找到该标识。它可能是"网络服务"。
将应用程序池使用的身份的读取权限添加到证书中
打开 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;用户并选择总控制。