2015-10-07 51 views
2

在我的ASP.NET应用程序中我加载从证书存储的证书:证书私钥下,IIS Web服务器将引发CryptographicException

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

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

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

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

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

我已通过检查确认myCert对象的其他字段包含相同的值(如,例如,证书序列号,指纹或到期),所以它似乎它在IISIIS Express下获得相同的证书。在完整IIS的情况下,只有私钥丢失。

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

有没有人有一个想法,为什么这会发生?

回答

5

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

遵循以下步骤:

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

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

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

    选择应用程序池连接左侧树,发现在中间面板的身份。这可能是“网络服务”。

  3. 为使用应用程序池到您的证书

    打开Microsoft管理控制台mmc)的身份,加上证书管理单元在本地计算机帐户,发现添加读取权限您证书在个人证书。打开其上下文菜单所有任务管理私钥...。点击添加..,输入身份(“NETWORK SERVICE”)并点击检查名称确定权限只允许阅读权限。

    您可以在这个问题看细节:How to give ASP.NET access to a private key in a certificate in the certificate store?

+0

我明白了。这确实是有道理的。但是,我能做些什么来在完整的IIS下使用该证书和密钥? –

+1

@DawidFerenczy你可以授予池身份证书访问权限。在mmc的证书管理管理单元中这样做很容易。 –

+0

好的,所以我确定了用于我的应用程序的应用程序池。此应用程序池的标识设置为“NetworkService”,因此我需要授予该帐户的证书访问权限,对不对?我已经检查了MMC中的证书,但我无法找到配置权限的位置。请问你能帮帮我吗?我还需要什么权限? –

0

我是有这个问题来调试应用程序“.PrivateKey‘扔类型的异常’System.Security.Cryptography.CryptographicException” 我解决像这样:

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

+0

此解决方案在我的场景中不起作用。我已经为几乎IUSRS,每个人,IUSR ...设置了最高权限,但仍然是“store.storehandle抛出了system.security.cryptography.cryptographicexception类型的异常“被解雇..任何意见..高度赞赏。 – Amruta