我正在尝试在我的 WCF 服务中促进加密 SOAP 消息传递。为此,我必须安装并配置生产证书。当我使用现有的机器证书时,一切正常。但我不想使用该证书,因此我使用“Web 服务器”模板创建了一个通过 Active Directory 证书服务获得的新证书。当我在 Web.config 中实现此证书时,现在在尝试查看 WSDL 时收到此错误消息:
Keyset does not exist. It is likely that certificate 'CN=myservice.mydomain.com, O=My Company, L=My City, S=My State' may not have a private key that is capable of key exchange or the process may not have access rights for the private key. Please see inner exception for detail.
我已经看到很多针对此问题的帮助响应,但大多数人只是假设我有权限问题,或者我的证书位于错误的存储中,或者我的应用程序池在不同的帐户下运行。
以下是我检查过的所有内容的摘要:
- 我已确认(使用 winhttpcertcfg 和 MMC)我的证书位于同一存储区 (LOCAL_MACHINE\My),并且它们都具有相同的权限分配。
- 我已确认我的 IIS 应用程序池正在网络服务下运行,甚至尝试重新启动该池。
- 这两个证书均由同一 CA 颁发和签名,该 CA 位于受信任的根 CA 存储文件夹中。
- 两个证书均将 key 用法显示为“数字签名, key 加密 (a0)”
我还需要注意其他事项以确保我的新证书能够进行 key 交换吗?
最佳答案
经过一番折腾,终于解决了我的问题,现在分享给大家...
首先,我确定网络上有关此主题的许多建议都已经过时了。至少在我的环境(IIS 7 和 Windows 2008)中,不再需要 Web CA 接口(interface)/certsrv,winhttpcertcfg 也不再需要。两者都被 MMC 取代。
最后,我要做的是:
- 使用证书模板控制台在我的 CA 上安装新的证书模板
- 复制现有的 Web 服务器模板
- 确保使用 Windows Server 2003 版本(因为 2008 会导致“指定的提供程序类型无效”错误)
- 将私钥标记为可导出(仍不完全确定为什么/是否有必要这样做,但许多帖子建议这样做)
- 在“安全”选项卡下为“域计算机”和“经过身份验证的用户”提供“注册”
- 使用证书颁发机构“颁发”新证书模板
- 使用 Web 服务器上 MMC 中的证书管理单元请求新证书
- 从“个人\证书”文件夹中,右键单击并选择“所有任务”->“请求新证书”。这是/certsrv Web CA 界面的一个很好的简单替代方案。
- 请务必在提示输入其他信息时指定“通用名称”字段。
- 通过右键单击证书并选择“所有任务”->“管理私钥”,向新证书授予网络服务权限。 (这是使用 winhttpcertcfg 的一个很好的简单替代方案)
我没有找到任何一篇文章或博客文章在一个地方提供所有这些信息,我不得不从六七个不同的推荐解决方案中拼凑起来。希望这可以帮助其他人摆脱我所经历的头痛。
关于.net - WCF - 证书...可能没有能够进行 key 交换的私钥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24541785/