证书“ CN = ds.com”必须具有私钥。该过程必须具有私钥的访问权限

时间:2018-07-04 13:31:29

标签: c# wcf iis certificate makecert

经过大量搜索并尝试了其他答案,每种解决方案-仍然没有成功

  

简短的序言:我的计算机对自身的响应请求-确实适用于证书。从另一台计算机到我的计算机-不会。

在我的机器上-我创建了2个证书:公钥和私钥,通过:

makecert -r -pe -n "CN=ds.com" -b 01/01/2018 -e 01/01/2020 
-sky exchange Server.cer -sv Server.pvk

然后:

pvk2pfx.exe -pvk Server.pvk -spc Server.cer -pfx Server.pfx

(摘自here

我已经将它们两者安装在我的机器上的商店中(通过mmc):

enter image description here

我正在使用这个简单的WCF config,该主机托管在机器上的WAS IIS中。

当我使用以下简单代码调用该服务(从我的机器到自身)时:

  WSHttpBinding myBinding = new WSHttpBinding();
            myBinding.Security.Mode = SecurityMode.Message;
            myBinding.Security.Message.ClientCredentialType =MessageCredentialType.Certificate;
            EndpointAddress ea = new
                EndpointAddress("http://ds.com/Service1.svc/HelloWorldService");

            var client   = new HelloWorldServiceClient(myBinding, ea);

            client.ClientCredentials.ClientCertificate.SetCertificate(
                StoreLocation.CurrentUser,
                StoreName.Root,
                X509FindType.FindByThumbprint,
                "9394f570069e7af263ef7ca5a46a5bcab9f68659");
    Console.WriteLine(client.GetMessage("Mike Liu"));
    Console.ReadLine();
    client.Close();

-我确实得到结果:

enter image description here

太好了。

现在,让我们转到另一台计算机,该计算机是我在 only 中安装的公用密钥证书放入受信任的根目录中。

但是-现在,当我访问我的计算机(使用相同的代码^)时-出现以下错误:

  

证书“ CN = ds.com”必须具有私钥。该过程必须   拥有私钥的访问权限。

即使我在计算机上关闭了WAS IIS服务,我仍然在另一台计算机上看到错误。

似乎问题仅出在另一台机器上。我已经在另一台机器上设置了权限:

C:\ProgramData\Microsoft\Crypto <--------Everyone: full control +inheritance

问题:

我在这里想念什么?为什么要在客户端计算机中寻找私钥。它不应该具有私钥。专用服务器只能驻留在服务计算机中。 (这是我的机器)。

Full stack trace image (at the other machine)

1 个答案:

答案 0 :(得分:1)

在您的示例中,您在服务器和客户端上使用相同的证书。那不是应该的。

为了保护客户端请求,必须使用客户端证书对请求进行签名,并使用服务器证书对服务器响应进行签名。

因此在客户端上,您应该具有:

    客户证书在其个人证书存储中的
  • 私钥(和公用)
  • 受信任的根权限中服务器证书的公钥

在服务器上,您应该有相反的意思:

    服务器证书在其个人证书存储中的
  • 私钥(和公用)
  • 受信任的根权限中客户证书的公共密钥

您可以查看示例here,并详细了解here

article中很好地描述了有关HTTPS协议的详细信息。