Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 证书';CN=ds.com';必须有私钥。进程必须具有私钥的访问权限_C#_Wcf_Iis_Certificate_Makecert - Fatal编程技术网

C# 证书';CN=ds.com';必须有私钥。进程必须具有私钥的访问权限

C# 证书';CN=ds.com';必须有私钥。进程必须具有私钥的访问权限,c#,wcf,iis,certificate,makecert,C#,Wcf,Iis,Certificate,Makecert,在寻找了很多并尝试了其他人的答案之后,每一个解决方案——仍然没有成功 简短的前言:从我的机器到自身的响应请求-与证书一起工作。从另一台计算机到我的机器-它没有 在我的机器中-我通过以下方式创建了两个证书:公钥和私钥: 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 Ser

在寻找了很多并尝试了其他人的答案之后,每一个解决方案——仍然没有成功

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

在我的机器中-我通过以下方式创建了两个证书:公钥和私钥:

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):

我使用的是我在我的机器上托管的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();
-我得到的结果是:

太好了

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

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

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

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

看来问题只出在另一台机器上。我已经在另一台计算机中设置了权限:

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

C:\ProgramData\Microsoft\Crypto在您的示例中,您在服务器和客户端上使用的是相同的证书。这不是它应该是的

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

因此,在客户机上,您应该:

  • 客户端证书在其个人证书存储中的私钥(和公钥)
  • 受信任根权限内服务器证书的公钥
在服务器上,您应该具有以下站点:

  • 服务器证书在其个人证书存储中的私钥(和公钥)
  • 受信任根权限内客户端证书的公钥
您可以查看示例并阅读更多关于它的信息


关于HTTPS协议的详细信息在本文中有很好的描述。

感谢您的回复-据我所知(可能是错误的),服务器应该有公共和私人证书。而用户应该只有公共的。他们可以加密数据,只有私钥才能打开。不如果是,我不明白为什么世界各地的客户机都应该有私钥。在客户机和服务器之间的通信中,您既有请求也有响应。来自客户端的请求使用服务器公钥加密,并使用服务器上的服务器私钥解密。来自服务器的响应使用客户机公钥加密,并在客户机上使用客户机私钥解密。所以是的,你们两个都需要。您说过“关于HTTPS的详细信息”-但我的代码使用
EndpointAddress ea=newendpointaddress(“http://ds.com/Service1.svc/HelloWorldService");(非HTTPS)。那么它是如何工作的呢?另外,`client.ClientCredentials.ClientCertificate.SetCertificate`代码是用于消息加密还是用于解密?当服务器返回响应时?我并没有真正注意到这一点。您正在使用
SecurityMode.Message
。这意味着消息是加密的,而不是传输层(HTTPS)。关于公钥/私钥和加密的理论仍然是相同的。您可以在中看到WCF安全模式的差异。