CryptographicException'Keyset不存在',但只能通过WCF

我有一些代码可以调用使用X.509authentication保护的第三方Web服务。

如果我直接调用代码(使用unit testing),它没有任何问题。

部署时,将通过WCF服务调用此代码。 我添加了第二个调用WCF服务的unit testing,但是,当我调用第三方Web服务的方法时,将失败,出现CryptographicException ,消息"Keyset does not exist"

我认为这是因为我的WCF服务将尝试使用不同的用户给我自己调用第三方Web服务。

任何人都可以在这个问题上进一步阐明?

这可能是证书上的权限问题。

在运行unit testing时,您将在自己的用户上下文中执行这些testing(根据客户端证书所在的存储位置)将有权访问该证书的私钥。

但是,如果您的WCF服务托pipe在IIS下,或者作为Windows服务,它很可能会在服务帐户(networking服务,本地服务或其他受限帐户)下运行。

您将需要在私钥上设置适当的权限,以允许该服务帐户访问它。 MSDN有详细信息

这很可能是因为IIS用户无权访问您的证书的私钥。 您可以按照以下步骤进行设置…

  1. 开始 – >运行 – > MMC
  2. 文件 – >添加/删除pipe理单元
  3. 添加证书pipe理单元
  4. select计算机帐户,然后点击下一步
  5. select本地计算机(默认),然后单击完成
  6. 在Console Root的左侧面板上,导航到证书(本地计算机) – >个人 – >证书
  7. 你的证书很可能在这里。
  8. 右键单击您的证书 – >所有任务 – >pipe理私钥
  9. 在此设置您的私钥设置。

昨晚我有同样的问题。 私钥的权限设置正确,除了Keyset不存在错误外,一切显然都很好。 最后,事实certificate,证书是先导入到当前的用户存储,然后移动到本地机器商店。 然而 – 这并没有移动私钥,这仍然是在

C:\ Documents and settng \pipe理员…

代替

C:\ Documents and settng \所有用户…

Alt键的权限设置正确,ASPNET无法访问它。 当我们重新导入证书以便将私钥放入“所有用户”分支时,问题就消失了。

尝试从Visual Studio运行WCF应用程序时遇到同样的问题。 通过以pipe理员身份运行Visual Studio来解决此问题。

我遇到了这个问题,我的证书有私钥,但我得到这个错误( “Keyset不存在”

原因:您的网站正在“networking服务”帐户下运行,或者拥有较less的权限。

解决scheme :将应用程序池标识更改为“本地系统”,重置IIS并再次检查。 如果它开始工作是权限/较less的特权问题,您可以模拟,然后使用其他帐户。

完全令人沮丧,我有同样的问题,并尝试了以上大部分。 导出的证书正确有权读取C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys ,但事实certificate它没有对该文件夹的权限。 添加它,它的工作

从IIS浏览时要解决“键盘不存在”: 可能是为了私人许可

要查看并授予权限:

  1. 运行> MMC>是
  2. 点击文件
  3. 点击添加/删除pipe理单元…
  4. 双击证书
  5. 计算机帐户
  6. 下一个
  7. 点击证书(本地计算机)
  8. 点击个人
  9. 点击证书

给予权限:

  1. 右键单击证书的名称
  2. 所有任务>pipe理私钥…
  3. 添加并赋予权限(添加IIS_IUSER并赋予它特权为我工作)

我也有类似的问题。 我已经使用了这个命令

 findprivatekey root localmachine -n "CN="CertName" 

结果显示私钥在c:\ ProgramData文件夹中,而不是C:\ Documents and settngs \ All users ..

当我从c:\ ProgramData文件夹中删除密钥时,再次运行findPrivatekey命令不成功。 即。 它没有find钥匙。

但是,如果我search早先命令返回的相同的密钥,我仍然可以find密钥

C:\ Documents and settng \ \所有用户

所以据我的理解,IIS或托pipe的WCF没有从C:\ Documents and settngs \ All users中find私钥。

我得到的错误:CryptographicException'键集不存在'当我运行MVC应用程序。

解决scheme是:将个人证书授予应用程序池正在运行的帐户。 在我的情况下,它是添加IIS_IUSRS和select正确的位置解决了这个问题。

 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. 

我发现一些缺失的信息,帮助我得到了我的WCF服务的消息级别的安全性,通过“密钥集不存在”,我一直在运行,尽pipe授予从互联网上的例子生成的所有密钥的权限。

我最终将私钥导入到本地计算机上的可信人员存储中,然后授予私钥正确的权限。

这填补了我的空白,并最终允许我实现具有消息级安全性的WCF服务。 我正在构build一个必须符合HIPPA的WCF。

如果您为应用程序池使用ApplicationPoolIdentity,则可能在registry编辑器中指定了该“虚拟”用户的权限(系统中没有此用户)。

所以,使用启用设置registryACL的subinacl – 命令行工具,或类似的东西。

我只是想添加一个健康检查的答案。 即使在将证书安装到我的计算机上的正确存储并为客户端拥有所有正确的安全权限之后,我仍然收到了完全相同的错误。 原来我混了我的clientCertificate和我的服务证书。 如果你已经尝试了上述所有内容,我会仔细检查你是否有这两个。 一旦我这样做了,我的应用程序成功地调用了Web服务。 再一次,只是一个健全的检查。

在IIS7上使用openAM Fedlet时收到此错误

更改默认网站的用户帐户解决了问题。 理想情况下,你会希望这是一个服务帐户。 也许甚至是IUSR账户。 build议查找IIS强化的方法来完全确定它。