我有一些代码,用于调用一个使用X.509认证进行保护的第三方网络服务。
如果我直接调用该代码(使用单元测试),则可以正常工作,没有任何问题。
当部署后,将通过WCF服务调用此代码。我添加了第二个单元测试来调用WCF服务,但是当我调用第三方网络服务的方法时,它会出现CryptographicException,错误信息为"Keyset does not exist"。
我想这是因为我的WCF服务将尝试使用不同的用户来调用第三方网络服务。
有人可以在这个问题上提供更多的指示吗?
我有一些代码,用于调用一个使用X.509认证进行保护的第三方网络服务。
如果我直接调用该代码(使用单元测试),则可以正常工作,没有任何问题。
当部署后,将通过WCF服务调用此代码。我添加了第二个单元测试来调用WCF服务,但是当我调用第三方网络服务的方法时,它会出现CryptographicException,错误信息为"Keyset does not exist"。
我想这是因为我的WCF服务将尝试使用不同的用户来调用第三方网络服务。
有人可以在这个问题上提供更多的指示吗?
这很可能是因为IIS用户没有访问您证书的私钥。您可以按照以下步骤进行设置...
这可能是证书权限问题。
在运行单元测试时,您将在自己的用户上下文中执行这些操作,这取决于客户端证书存储在哪个存储区中,该用户将可以访问该证书的私钥。
但是,如果您的WCF服务在IIS下托管或作为Windows服务运行,则很可能会在服务帐户(Network Service、Local Service或其他受限帐户)下运行。
您需要设置适当的权限以允许该服务帐户访问私钥。 MSDN有详细信息。
昨晚我遇到了相同的问题。私钥权限设置正确,一切似乎都很好,除了"密钥集不存在"的错误。最后发现证书是首先导入到当前用户存储中,然后移动到本地计算机存储中。然而,这没有移动私钥,私钥仍然在
C:\Documents and settngs\Administrator...
而不是
C:\Documents and settngs\All users...
虽然密钥的权限设置正确,但ASPNET无法访问它。当我们重新导入证书,以便将私钥放置在All users分支中时,问题消失了。
当我试图从Visual Studio运行WCF应用程序时,遇到了相同的问题。通过以管理员身份运行Visual Studio来解决它。
我遇到了这个问题,我的证书有私钥,但是我却遇到了这个错误("密钥集不存在")
原因:你的网站正在使用“网络服务”帐户运行或者权限不足。
解决方案:将应用程序池标识更改为“本地系统”,重新设置IIS并再次检查。 如果开始工作了,则是权限/较低权限问题,你也可以使用其他帐户进行模拟。
非常沮丧,我遇到同样的问题并尝试了大部分以上方法。导出证书时正确地具有读取 C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys 文件的权限,但事实证明它没有文件夹权限。添加权限后问题得以解决。
IISAPPPool\www.mywebsite.com,这是我的应用程序池的Windows用户名,结果它奏效了 :-) - Simon_Weaver我遇到了一个错误: 当我运行MVC应用程序时,出现了CryptographicException 'Keyset does not exist'。
解决方案是:为应用程序池正在运行的帐户授予个人证书访问权限。在我的情况下,添加IIS_IUSRS并选择正确的位置解决了这个问题。
RC on the Certificate - > All tasks -> Manage Private Keys -> Add->
For the From this location : Click on Locations and make sure to select the Server name.
In the Enter the object names to select : IIS_IUSRS and click ok.
我也遇到了完全相同的问题。 我使用了以下命令:
findprivatekey root localmachine -n "CN="CertName"
结果显示私钥在 c:\ProgramData 文件夹而不是 C:\Documents and settngs\All users..
当我从 c:\ProgramData 文件夹中删除密钥后,再次运行 findPrivatekey 命令失败。也就是说,它找不到密钥。
但如果我搜索先前命令返回的相同密钥,则仍然可以在 C:\Documents and settngs\All users.. 中找到该密钥。
因此,我认为 IIS 或托管的 WCF 无法从 C:\Documents and settngs\All users.. 中找到私钥。