首页 文章

CryptographicException 'Keyset does not exist',但只能通过WCF

提问于
浏览
138

我有一些代码调用使用X.509认证保护的第三方Web服务 .

如果我直接调用代码(使用单元测试),它可以正常工作 .

部署后,将通过WCF服务调用此代码 . 我添加了第二个调用WCF服务的单元测试,但是当我在第三方Web服务上调用方法时,这会失败 CryptographicException ,消息 "Keyset does not exist" .

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

任何人都可以解决这个问题吗?

15 回答

  • 36

    我只想添加一个完整性检查答案 . 即使在将证书安装到我的机器上的正确存储并且具有客户端的所有正确安全权限之后,我也得到完全相同的错误 . 结果我混淆了我的clientCertificate和我的服务证书 . 如果你已经尝试了以上所有,我会仔细检查你是否有这两个 . 一旦我这样做,我的应用程序成功调用了Web服务 . 再次,只是一个理智检查员 .

  • 0

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

    更改默认网站的用户帐户解决了该问题 . 理想情况下,您希望这是一个服务帐户 . 甚至可能是IUSR账户 . 建议查找IIS强化方法以完全解决问题 .

  • 8

    我发现了一些缺少的信息,这些信息帮助我获得了我的WCF服务,其中消息级别的安全性超过了我仍然遇到的“Keyset不存在”,尽管授予了从互联网上的示例生成的所有密钥的权限 .

    我最终将私钥导入本地计算机上的受信任的人员存储区,然后授予私钥正确的权限 .

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

  • 0

    如果将ApplicationPoolIdentity用于应用程序池,则可能在注册表编辑器中为该“虚拟”用户指定权限时出现问题(系统中没有此类用户) .

    因此,使用subinacl - 启用set registry ACL的命令行工具,或类似的东西 .

  • 0

    我也有类似的问题 . 我用过这个命令

    findprivatekey root localmachine -n "CN="CertName"
    

    结果显示私钥位于c:\ ProgramData文件夹而不是C:\ Documents和settngs \所有用户..

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

    但是如果我搜索前面命令返回的相同密钥,我仍然可以找到密钥

    C:\ Documents and settngs \所有用户..

    所以据我所知,IIS或托管的WCF没有从C:\ Documents和settngs \ All中找到私钥用户..

  • 10

    我收到错误:当我运行MVC应用程序时,CryptographicException'Keyset不存在' .

    解决方案是:允许访问运行应用程序池的帐户的个人证书 . 在我的情况下,它是添加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.
    
  • 3

    我遇到过这个问题,我的证书有私钥,但我收到了这个错误( "Keyset does not exist"

    Cause: 您的网站在"Network services"帐户下运行或具有较少的权限 .

    Solution :将应用程序池标识更改为"Local System",重置IIS并再次检查 . 如果它开始工作它是权限/更少权限问题,您可以模拟然后使用其他帐户 .

  • 0

    完全令人沮丧,我遇到了同样的问题并尝试了上述大部分内容 . 导出的证书正确地具有读取 C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys 中的文件的权限,但事实证明它没有该文件夹的权限 . 添加它,它工作

  • 1

    它可能是证书上的权限问题 .

    运行单元测试时,您将在您自己的用户上下文中执行这些操作,这取决于客户端证书所在的商店是否可以访问该证书的私钥 .

    但是,如果您的WCF服务托管在IIS下,或者作为Windows服务,它可能会在服务帐户(网络服务,本地服务或其他一些受限帐户)下运行 .

    您需要在私钥上设置适当的权限,以允许该服务帐户访问它 . MSDN已the details

  • 16

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

    • 开始 - >运行 - > MMC

    • 文件 - >添加/删除Snapin

    • 添加证书管理单元

    • 选择计算机帐户,然后点击下一步

    • 选择“本地计算机”(默认设置),然后单击“完成”

    • 在控制台根目录的左侧面板中,导航到证书(本地计算机) - >个人 - >证书

    • 您的证书很可能就在这里 .

    • 右键单击您的证书 - >所有任务 - >管理私钥

    • 在此设置您的私钥设置 .

  • 20

    我昨晚有同样的问题 . 私钥的权限设置正确,除了Keyset不存在错误外,一切都很好 . 最后,结果证明证书首先导入当前用户存储,然后移动到本地计算机存储 . 但是 - 没有移动私钥,这仍然在

    C:\ Documents and settngs \ Administrator ...

    代替

    C:\ Documents and settngs \所有用户......

    正确设置了密钥的Altough权限,ASPNET无法访问它 . 当我们重新导入证书以便将私钥放在All users分支中时,问题就消失了 .

  • 156

    To solve the “Keyset does not exist” when browsing from IIS: It may be for the private permission

    查看并授予权限:

    • 运行> mmc>是

    • 点击文件

    • 点击添加/删除管理单元...

    • 双击证书

    • 计算机帐户

    • 下一步

    • 完成

    • 好的

    • 点击证书(本地计算机)

    • 点击个人

    • 单击“证书”

    给予许可:

    • 右键单击证书名称

    • 所有任务>管理私钥......

    • 添加并授予权限(添加IIS_IUSRS并赋予它权限对我有用)

  • 0

    尝试从Visual Studio运行WCF应用程序时遇到同样的问题 . 通过以管理员身份运行Visual Studio解决了这个问题 .

  • 3

    在用于验证我们的密钥保险库已过期且已轮换的证书之后,我在我的服务结构项目中点击了此项,这改变了指纹 . 我收到此错误是因为我错过了更新此块中applicationManifest.xml文件中的指纹,这正是其他答案所建议的 - 给予NETWORK SERVICE(我所有的exes运行,as azure servicefabric cluster的标准配置)权限访问LOCALMACHINE \ MY证书库位置 .

    请注意“X509FindValue”属性值 .

    <!-- this block added to allow low priv processes (such as service fabric processes) that run as NETWORK SERVICE to read certificates from the store -->
      <Principals>
        <Users>
          <User Name="NetworkService" AccountType="NetworkService" />
        </Users>
      </Principals>
      <Policies>
        <SecurityAccessPolicies>
          <SecurityAccessPolicy ResourceRef="AzureKeyvaultClientCertificate" PrincipalRef="NetworkService" GrantRights="Full" ResourceType="Certificate" />
        </SecurityAccessPolicies>
      </Policies>
      <Certificates>
        <SecretsCertificate X509FindValue="[[THIS KEY ALSO NEEDS TO BE UPDATED]]" Name="AzureKeyvaultClientCertificate" />
      </Certificates>
      <!-- end block -->
    
  • 250

    我刚刚在本地机器上重新安装了我的证书,然后它运行正常

相关问题