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安全模式的差异。