证书“CN=ds.com”必须有一个私钥。进程必须拥有私钥的访问权限

在搜索了很多并尝试了其他人的答案后,每个解决方案 - 仍然没有成功

简短的前言:从我的机器到自身的响应请求 - 与证书一起工作。从另一台计算机到我的机器 - 它没有。

在我的机器上 - 我创建了 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

(取自这里

我已经安装了他们在店里在我的机器(通过MMC):

http://img4.mukewang.com/6147182a0001af2207550529.jpg

我正在使用这个简单的WCF 配置,它托管在我机器上的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();

— 我确实得到了结果:

http://img.mukewang.com/614718370001449e02110090.jpg

伟大的。

现在让我们转到另一台计算机,我将公钥证书安装到受信任的根中。

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

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

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

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

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

题:

我在这里错过了什么?为什么它会在客户端机器中寻找私钥。它不应该有私钥。私人应仅驻留在服务计算机中。(这是我的机器)。


慕丝7291255
浏览 237回答 1
1回答

慕工程0101907

在您的示例中,您在服务器和客户端上使用相同的证书。那不是它应该的样子。为了保护客户端请求,您必须使用客户端证书对请求进行签名,并且服务器响应使用服务器证书进行签名。所以在客户端你应该有:其个人证书存储中的客户端证书的私钥(和公钥)受信任的根授权中服务器证书的公钥在服务器上你应该有相反的:它的个人证书存储中的服务器证书的私钥(和公钥)受信任的根授权中客户端证书的公钥你可以看到例如这里和阅读更多关于它在这里。这篇文章很好地描述了有关 HTTPS 协议的详细信息。
打开App,查看更多内容
随时随地看视频慕课网APP