我有一个消耗WCF的 WinForms 应用程序,并将一个参数传递给函数证书:
mySvcClient.SendDocument(cert.Export(X509ContentType.SerializedCert, "password"));
...
在WCF服务中,我从字节数组重新创建了证书:
public void SendDocument (byte[] binaryCert)
{
X509Certificate2 cert = new X509Certificate2(binaryCert, "password");
...
但是当使用证书签署xml时,我收到错误“Keyset不存在”:
if (cert.HasPrivateKey) // WORKS!!!
{
signedXml.SigningKey = cert.PrivateKey; // THROW "keyset does not exist" EXCEPTION
...
在我的电脑中,该应用程序100%正常工作!但是在WebServer中,我收到了这个错误!
问题是:即使X509Certificate2从一个字节数组重新创建,我需要一些特殊权限才能访问私钥?
谢谢!
答案 0 :(得分:35)
如果您使用的是Windows Server 2008或Windows 7,则需要获得读取私钥的权限。
FindPrivateKey My LocalMachine -n“CN = MyCert”-a
它返回路径:C:\ ProgramData \ Microsoft \ Crypto \ RSA \ MachineKeys [文件名]
转到该路径并打开文件属性
转到安全标签
点击“编辑”,然后点击“添加”
在打开的对话框中写入:IIS AppPool \ [您的应用程序池名称],然后单击“确定”
现在您的应用程序池有权读取此私钥。
答案 1 :(得分:30)
我遇到过这个问题,我的证书有私钥,但是我收到了这个错误(“ Keyset不存在”)
原因:您的网站在“网络服务”帐户下运行或权限较少。
解决方案:将应用程序池标识更改为“本地系统”,重置IIS 并再次检查。如果它开始工作,则是权限/较少权限问题,您可以模拟然后使用其他帐户。
答案 2 :(得分:11)
我遇到了同样的问题,我不知道(对我感到羞耻),但它有效:
var certificate = new X509Certificate2(filePath, password,
X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet);
certificate.PrivateKey; // before: error "KeySet does not exist"!
using (certificate.GetRSAPrivateKey()) { } // pure black magic
certificate.PrivateKey; // after: just works! lol
我希望有人能回答这个谜。
答案 3 :(得分:4)
Vano Maisuradze回答有效。如果您正在寻找FindPrivateKey工具,它将包含在Windows Communication Foundation(WCF)和Windows Workflow Foundation(WF).NET Framework 4示例中,可在此处找到:http://www.microsoft.com/en-us/download/confirmation.aspx?id=21459
下载并解压缩后,在Visual Studio中打开项目:WF_WCF_Samples \ WCF \ Setup \ FindPrivateKey \ CS并进行编译。然后打开命令提示符并导航到:WF_WCF_Samples \ WCF \ Setup \ FindPrivateKey \ CS \ bin
然后继续Vano Maisuradze回答
答案 4 :(得分:1)
我认为问题在于您需要将密钥添加到计算机的证书存储区。
答案 5 :(得分:0)
应用程序池标识帐户默认情况下无权访问证书存储区。
您可以按照Vaibhav.Inspired的指示更改为Network Services
帐户,或者您可以访问证书。
要允许访问,请执行以下命令:
WinHttpCertCfg.exe -g -c LOCAL_MACHINE \ MY -s" IssuedToName" -一个 "帐户名"
注意:
- The tool may need to be installed first. The setup will place the tool at `C:\Program Files (x86)\Windows Resource Kits\Tools\WinHttpCertCfg.exe`.
- `IssuedName` is the issuer property of the certificate that the application will attempt to access
- The command must be run from command prompt with elevated privileges
您还需要在安装证书时启用Mark this key as exportable
选项。