我正在创建一个WCF应用程序,其中我将使用证书来加密客户端和服务器之间的通信。在我的开发环境中,我想使用使用makecert创建的测试证书/自签名证书。(只有服务器有证书,客户端没有)。
我已经将证书安装到证书存储中,一切正常。在客户端,certificateValidationMode当前设置为"false",因为我使用的是测试证书。
我的问题是:
在客户机上的app.config中,我需要将标识元素指定为:
<endpoint ... >
<identity>
<dns value="<Name-Of-Server-Computer>"/>
</identity>
</endpoint>
如果删除identity元素,则在尝试连接到服务器时,客户端中会出现以下错误消息:
传出邮件的
身份检查失败。远程终结点的DNS标识应为'localhost‘,但远程终结点提供了DNS声明'Name- of -Server-Computer’。如果这是合法的远程终结点,则可以通过在创建通道代理时将DNS标识“”服务器计算机名称“”显式指定为EndpointAddress的标识属性来解决此问题。“”
所以我的问题是:
发布于 2009-10-27 19:38:14
检查一直都在进行--而且应该这样做。基本上,WCF将检查证书是否颁发给您的服务所在的域名(yourcompany.com)或机器名。这是一个我永远不会禁用的安全检查!否则,任何欺骗你的服务的人都可以使用任意域名/机器名的任何证书来获取你的流量--而不是你想要的!
因此,您需要确保生产服务器上的实际证书确实颁发给生产服务器所属的域名,例如,如果您的生产服务器将位于"production.yourcompany.com“中,则需要将证书颁发给该域。
Marc
发布于 2011-11-22 20:34:45
这个问题的答案在错误消息本身中。在客户端上,您可以执行以下操作:
EndpointIdentity identity = EndpointIdentity.CreateDnsIdentity("Server");
EndpointAddress address = new EndpointAddress(new Uri("net.tcp://1.2.3.4:12345/ServiceName"), identity);
将“服务器”替换为所需的任何内容。通常,这是您的自签名证书的通用名称(CN)。这样做不会破坏安全性,只要您承担所有责任来确保提供的证书是有效的,即创建您的自定义证书验证器并在那里进行相关检查。
发布于 2012-12-03 23:40:39
certificateValidationMode应该设置为"None",而不是"false"...
https://stackoverflow.com/questions/1629715
复制相似问题