我有一些代码可以调用使用X.509认证保护的第三方Web服务。
如果我直接调用代码(使用单元测试),它将正常工作。
部署后,将通过WCF服务调用此代码。我添加了另一个调用WCF服务的单元测试,但是当我在第三方Web服务上调用方法时,此失败并CryptographicException
显示消息"Keyset does not exist"
。
我认为这是因为我的WCF服务将尝试使用与我自己不同的用户来调用第三方Web服务。
任何人都可以在这个问题上提出更多的建议吗?
我有一些代码可以调用使用X.509认证保护的第三方Web服务。
如果我直接调用代码(使用单元测试),它将正常工作。
部署后,将通过WCF服务调用此代码。我添加了另一个调用WCF服务的单元测试,但是当我在第三方Web服务上调用方法时,此失败并CryptographicException
显示消息"Keyset does not exist"
。
我认为这是因为我的WCF服务将尝试使用与我自己不同的用户来调用第三方Web服务。
任何人都可以在这个问题上提出更多的建议吗?
Answers:
这很可能是因为IIS用户无权访问证书的私钥。您可以按照以下步骤进行设置...
昨晚我遇到了同样的问题。私钥的权限设置正确,除Keyset不存在错误外,其他一切似乎都很好。最后,结果证明证书首先被导入到当前的用户存储中,然后又被移至本地计算机存储中。但是-并没有移动私钥,该私钥仍在
C:\ Documents and settngs \ Administrator ...
代替
C:\ Documents and settngs \ All users ...
正确设置了密钥的足够权限,ASPNET无法访问它。当我们重新导入证书,以便将私钥放在“所有用户”分支中时,问题消失了。
解决从IIS浏览时“键集不存在”的问题: 可能是为了获得私人许可
要查看并给予许可:
授予许可:
我已经遇到了这个问题,我的证书拥有私钥,但是却出现此错误(“密钥集不存在”)
原因:您的网站在“网络服务”帐户下运行或特权较少。
解决方案:将应用程序池标识更改为“本地系统”,重置IIS,然后再次检查。如果它开始工作,那是权限/较少特权问题,您也可以模拟然后使用其他帐户。
完全令人沮丧的是,我遇到了同样的问题,并尝试了上述大多数方法。导出的证书正确具有读取中的文件的权限C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys
,但是事实证明,它对该文件夹没有权限。添加了它就可以了
IISAPPPool\www.mywebsite.com
了我的appool的Windows用户名,它起作用了:-)
我也有完全类似的问题。我已经使用了命令
findprivatekey root localmachine -n "CN="CertName"
结果显示私钥位于c:\ ProgramData文件夹中,而不是C:\ Documents和settngs \ All用户。
当我从c:\ ProgramData文件夹中删除密钥时,再次运行findPrivatekey命令不会成功。即。它找不到密钥。
但是,如果我搜索先前命令返回的相同密钥,我仍然可以在其中找到密钥
C:\ Documents and settngs \ All users ..
因此,据我了解,IIS或托管的WCF并未从C:\ Documents and settngs \ All用户中找到私钥。
我收到错误消息:当我运行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.
史蒂夫·谢尔顿(Steve Sheldon)的答案为我解决了这个问题,但是,由于我不使用gui编写证书权限脚本,因此我需要一个可编写脚本的解决方案。我很难找到我的私钥存储在哪里。私钥不在-C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys
,最终我发现它确实在C:\ProgramData\Microsoft\Crypto\Keys
。下面我描述如何发现这一点:
我尝试过,FindPrivateKey
但是找不到私钥,然后使用powershell$cert.privatekey.cspkeycontainerinfo.uniquekeycontainername
为null / empty。
幸运的是,certutil -store my
列出了证书,并给了我编写解决方案脚本所需的详细信息。
================ Certificate 1 ================ Serial Number: 162f1b54fe78c7c8fa9df09 Issuer: CN=*.internal.xxxxxxx.net NotBefore: 23/08/2019 14:04 NotAfter: 23/02/2020 14:24 Subject: CN=*.xxxxxxxnet Signature matches Public Key Root Certificate: Subject matches Issuer Cert Hash(sha1): xxxxa5f0e9f0ac8b7dd634xx Key Container = {407EC7EF-8701-42BF-993F-CDEF8328DD} Unique container name: 8787033f8ccb5836115b87acb_ca96c65a-4b42-a145-eee62128a ##* ^-- filename for private key*## Provider = Microsoft Software Key Storage Provider Private key is NOT plain text exportable Encryption test passed CertUtil: -store command completed successfully.
然后我扫描了c\ProgramData\Microsoft\Crypto\
文件夹并在C:\ ProgramData \ Microsoft \ Crypto \ Keys中找到了文件8787033f8ccb5836115b87acb_ca96c65a-4b42-a145-eee62128a。
授予我的服务帐户对该文件的读取访问权限为我解决了问题
我只是将证书重新安装在本地计算机上,然后工作正常
在用于对我们的密钥保险库进行身份验证的证书过期并被轮换使用后,我在服务结构项目中遇到了这一问题,从而更改了指纹。我收到此错误,是因为我错过了在此块中的applicationManifest.xml文件中更新指纹的功能,而该指纹恰恰做了其他答案的建议-给了NETWORK SERVICE(我所有的exe文件都运行为Azure Servicefabric群集的标准配置)权限访问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 -->
这是唯一为我工作的解决方案。
// creates the CspParameters object and sets the key container name used to store the RSA key pair
CspParameters cp = new CspParameters();
cp.KeyContainerName = "MyKeyContainerName"; //Eg: Friendly name
// instantiates the rsa instance accessing the key container MyKeyContainerName
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);
// add the below line to delete the key entry in MyKeyContainerName
// rsa.PersistKeyInCsp = false;
//writes out the current key pair used in the rsa instance
Console.WriteLine("Key is : \n" + rsa.ToXmlString(true));
This issue is got resolved after adding network service role.
CERTIFICATE ISSUES
Error :Keyset does not exist means System might not have access to private key
Error :Enveloped data …
Step 1:Install certificate in local machine not in current user store
Step 2:Run certificate manager
Step 3:Find your certificate in the local machine tab and right click manage privatekey and check in allowed personnel following have been added:
a>Administrators
b>yourself
c>'Network service'
And then provide respective permissions.
## You need to add 'Network Service' and then it will start working.