IIS Web Server下证书私钥抛出CryptographicException

Certificate private key throws CryptographicException under IIS Web Server

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

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

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

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

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

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

我检查过 myCert 对象的其他字段是否包含相同的值(例如,证书序列号、指纹或过期时间),所以它似乎在 [=30= 下获得了相同的证书]IIS 和 IIS Express。全IIS.

的情况下只缺少私钥

我唯一更改的是项目属性 ("Use IIE Express" / "Use IIS Web Server") 中的 Local Development Server。在这两种情况下,它都是 Azure Emulator Express 中的 运行。

有没有人知道为什么会这样?

运行 在 IIS Express 上,程序使用您的凭据访问证书,而在 IIS 上,使用池标识的凭据。您可以轻松检查证书 ACL 以查看允许或不允许的人。

按照以下步骤操作:

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

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

  2. 检查应用程序池使用的身份

    Select Application Pools 在左侧的 Connections 树中,并在中间面板中找到标识。可能是 "NETWORK SERVICE".

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

    打开 Microsoft 管理控制台 (mmc),为本地计算机帐户添加 Certificates 管理单元并找到您的 个人 证书下的证书。打开其上下文菜单,所有任务管理私钥...。单击 添加..,输入身份 ("NETWORK SERVICE") 然后单击 检查名称确定.在 的权限下,仅允许 Read 权限。

    你可以阅读这个问题的详细信息:How to give ASP.NET access to a private key in a certificate in the certificate store?

我在调试应用程序时遇到了这个问题“.PrivateKey”引发了“System.Security.Cryptography.CryptographicException”类型的异常 我这样解决:

在 mmc > 本地计算机 > 个人 > 证书 > 右键单击​​证书 > 所有任务 > 管理私钥: 添加 "everyone" 用户和 select 总控制。