WCF - 证书可能没有能够进行密钥交换的私钥

N1n*_*B0b 4 .net iis wcf certificate x509certificate

我试图在我的WCF服务中促进加密的SOAP消息传递.为此,我必须安装和配置生产证书.当我使用现有的机器证书时,一切正常.但我不想使用该证书,因此我使用"Web服务器"模板通过Active Directory证书服务创建了一个新证书.当我在Web.config中实现此证书时,现在我在尝试查看WSDL时收到此错误消息:

键集不存在.证书'CN = myservice.mydomain.com,O = My Company,L = My City,S = My State'可能没有能够进行密钥交换的私钥,或者该流程可能没有访问权限私钥.详情请见内部异常.

我已经看到了很多关于这个问题的帮助响应,但是大多数只是假设我有权限问题,或者我的证书存在错误的存储,或者我的应用程序池在不同的帐户下运行.

以下是我检查过的所有内容的摘要:

  1. 我已经确认(使用winhttpcertcfg和MMC)我的证书在同一个商店(LOCAL_MACHINE\My),并且它们都具有相同的权限分配.
  2. 我已经确认我的IIS应用程序池正在NETWORK SERVICE下运行,甚至尝试重新启动池.
  3. 两个证书都由相同的CA颁发和签名,该CA位于受信任的根CA存储文件夹中.
  4. 两个证书都将密钥用法显示为"数字签名,密钥加密(a0)"

还有什么我需要注意的,以确保我的新证书能够进行密钥交换吗?

N1n*_*B0b 7

经过多次动荡和拉扯之后,我终于解决了我的问题,现在我要和你分享......

首先,我确定网上关于这个主题的很多建议已经过时了.至少在我的环境中(IIS 7和Windows 2008),不再需要Web CA接口/ certsrv,winhttpcertcfg也不再需要.两者都被MMC取代.

最后,我要做的是:

  1. 使用"证书模板控制台"在我的CA上安装新的证书模板
    • 复制现有的Web服务器模板
    • 确保使用Windows Server 2003版本(因为2008导致"指定的提供程序类型无效"错误)
    • 将私钥标记为可导出(仍然不完全确定为什么/如果这是必要的,但许多帖子建议这样做)
    • 在"安全"选项卡下,将"域计算机"和"经过身份验证的用户"命名为"注册"
  2. 使用证书颁发机构"颁发"新证书模板
  3. 使用Web服务器上MMC中的"证书"管理单元,请求新证书
    • 在Personal\Certificates文件夹中,右键单击,然后选择All Tasks - > Request New Certificate.这是/ certsrv Web CA接口的一个很好的简单替代方案.
    • 当提示您输入其他信息时,请务必指定"公用名"字段.
  4. 通过右键单击证书并选择"所有任务" - >"管理私钥",将NETWORK SERVICE的权限授予新证书.(这是使用winhttpcertcfg的一个很好的简单替代方案)

我没有找到任何一篇文章或博客文章在一个地方提供所有这些信息,我不得不从六个或七个不同的推荐解决方案中拼凑出来.希望这有助于拯救别人免受我忍受的头痛.