【问题标题】:Certificate private key throws CryptographicException under IIS Web Server证书私钥在 IIS Web 服务器下引发 CryptographicException
【发布时间】:2016-01-05 07:15:27
【问题描述】:

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

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

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

证书安装在本地计算机下的个人证书存储中。当应用程序在 IIS Express 下运行时,它运行良好。但如果我在 full 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 中运行。

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

【问题讨论】:

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


    【解决方案1】:

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

    按照以下步骤操作:

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

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

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

      选择左侧Connections树中的Application Pools,在中间面板中找到标识。可能是“网络服务”。

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

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

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

    【讨论】:

    • 我明白了。这确实有道理。但是,我该怎么做才能在完整的 IIS 下使用该证书和密钥?
    • @DawidFerenczy 您可以授予池身份访问证书的权限。在 mmc 的证书管理管理单元中很容易做到这一点。
    • 好的,所以我确定了用于我的应用程序的应用程序池。此应用程序池的标识设置为“NetworkService”,所以我需要授予对该帐户证书的访问权限,对吗?我已经检查了 MMC 中的证书,但我无法找到配置权限的位置。请问你能帮帮我吗?我还需要什么权限?
    • 我已经解决了,这个 StackOverflow 问题帮助我设置了证书权限:stackoverflow.com/questions/2609859/…
    • 如何在没有任何 IIS 设置的情况下克服这个异常?
    【解决方案2】:

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

    在 mmc > 本地计算机 > 个人 > 证书 > 右键单击​​证书 > 所有任务 > 管理私钥: 添加“everyone”用户并选择Total Control。

    【讨论】:

    • 这个解决方案在我的场景中不起作用..我已经为几乎 IUSRS、Everyone、IUSR 设置了最高权限......但仍然是“store.storehandle”的相同异常引发了类型异常system.security.cryptography.cryptographicexception”被解雇了..任何建议..非常感谢。
    • 这对我有用。只需添加只有读取权限的“所有人”。
    猜你喜欢
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 2021-03-24
    • 2012-12-25
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多