CryptographicException'集不存在的',但只有通过WCF
题
我有一些代码,使得对第三方网服务担保的使用X.509认证。
如果我打电话代码直接(采用单元的测试)它的工作没有任何问题。
在部署时,这个代码将被称为通过WCF服务。我已经加入的第二个单元的测试,呼吁WCF服务,但是这个失败 CryptographicException
, 消息 "Keyset does not exist"
当我打电话的方法在第三方网服务。
我相信,这是因为我WCF服务将试图呼叫的第三方网服务使用不同的用户自己。
任何人都可以摆脱任何额外的光在这个问题?
解决方案
它可能是证书上的权限问题。
运行单元测试时,您将在自己的用户上下文中执行这些操作,这取决于客户端证书所在的商店中的内容)是否可以访问该证书的私钥。
但是,如果您的WCF服务托管在IIS下,或者作为Windows服务,它可能会在服务帐户(网络服务,本地服务或其他一些受限帐户)下运行。
您需要在私钥上设置适当的权限,以允许该服务帐户访问它。 MSDN已详细信息
其他提示
这很可能是因为IIS用户无权访问证书的私钥。您可以按照以下步骤进行设置......
- 开始 - >运行 - > MMC
- 文件 - >添加/删除Snapin
- 添加证书管理单元
- 选择计算机帐户,然后点击下一步
- 选择“本地计算机”(默认设置),然后单击“完成”
- 在Console Root的左侧面板中,导航至 证书(本地计算机) - >个人 - >证书
- 您的证书很可能就在这里。
- 右键点击您的证书 - >所有任务 - >管理私钥
- 在此处设置您的私钥设置。 醇>
我昨晚有同样的问题。私钥的权限设置正确,除了Keyset不存在错误外,一切都很好。最后,结果证明证书首先导入当前用户存储,然后移动到本地计算机存储。但是 - 没有移动私钥,它仍然在
中C:\ Documents and settngs \ Administrator ...
而不是
C:\ Documents and settngs \所有用户......
正确设置了密钥的Altough权限,ASPNET无法访问它。当我们重新导入证书以便将私钥放在All users分支中时,问题就消失了。
为了解决对"集不存在"浏览时从IIS: 它也可以为私人的权限
查和得到许可:
- 运行>mmc>是的
- 点击文件
- 点击增加/删除管理单元。
- 双击证书
- 电脑帐户
- 下
- 完成
- "确定"
- 点击证书(当地计算机)
- 击个人
- "证书"
得到的权限:
- 右击姓名的证书
- 所有任务>管理的私人钥匙...
- 添加,并给予特权(加IIS_IUSRS,并给予它的特权,对我的作品)
尝试从Visual Studio运行WCF应用程序时遇到同样的问题。通过以管理员身份运行Visual Studio解决了这个问题。
我遇到过这个问题,我的证书有私钥,但我收到了这个错误(“Keyset不存在”)
原因:您的网站正在“网络服务”下运行帐户或权限较少。
解决方案:将应用程序池标识更改为“本地系统”,重置IIS并再次检查。 如果它开始工作,则是权限/较少权限问题,您可以模拟然后使用其他帐户。
完全令人沮丧,我遇到了同样的问题并尝试了上述大部分内容。导出的证书正确地有权读取 C:\ ProgramData \ Microsoft \ Crypto \ RSA \ MachineKeys
中的文件,但事实证明它没有该文件夹的权限。添加它并且它起作用
我也有类似的问题。 我使用了命令
findprivatekey root localmachine -n "CN="CertName"
结果显示私钥位于c:\ ProgramData文件夹而不是C:\ Documents和settngs \所有用户..
当我从c:\ ProgramData文件夹中删除密钥时,再次运行findPrivatekey命令不成功。即。它找不到钥匙。
但如果我搜索前面命令返回的相同密钥,我仍然可以在
中找到密钥C:\ Documents and settngs \所有用户..
据我了解,IIS或托管的WCF没有从C:\ Documents和settngs \ All users中找到私钥..
当我运行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.
我发现了一些缺少的信息,这些信息帮助我通过“Keyset不存在”获得了消息级别安全性的WCF服务。尽管授予了从互联网上的例子生成的所有密钥的权限,但我一直在努力。
我最终将私钥导入本地计算机上的受信任人员存储区,然后授予私钥正确的权限。
这填补了我的空白,最后允许我实现具有消息级安全性的WCF服务。我正在构建一个必须符合HIPPA标准的WCF。
如果您将ApplicationPoolIdentity用于应用程序池,则可能无法为该“虚拟”指定权限。注册表编辑器中的用户(系统中没有此类用户)。
因此,请使用 subinacl - 命令行工具启用set registry ACL,或类似的东西。
我只想添加一个健全性检查答案。即使在将证书安装到我的机器上的正确存储并且具有客户端的所有正确安全权限之后,我也得到完全相同的错误。结果我混淆了我的clientCertificate和我的服务证书。如果你已经尝试了以上所有,我会仔细检查你是否有这两个。 一旦我这样做,我的应用程序成功调用了Web服务。 再一次,只是一个理智的检查员。
在IIS7上使用openAM Fedlet时收到此错误
更改默认网站的用户帐户解决了该问题。理想情况下,您希望这是一个服务帐户。甚至可能是IUSR账户。建议查找IIS强化方法以完全解决问题。
我在我的服务结构项目中点击了这个,之后用于验证我们的密钥保险库过期并且被轮换的证书,这改变了指纹。我收到此错误是因为我错过了更新此块中applicationManifest.xml文件中的指纹,这正是其他答案所建议的 - 给予NETWORK SERVICE(我所有的exes运行,as azure servicefabric cluster的标准配置)权限访问LOCALMACHINE \ MY证书商店位置。
注意“X509FindValue”和“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 -->
我刚刚在本地计算机上重新安装了我的证书,然后它运行正常