我在域mydomain.com上有两个WCF服务器(虚构示例,下面的IP也是如此),分别命名为server1和server2。
它们既可以通过其 public IP地址(foo.1和2)访问,也可以从它们所在的专用LAN(即192.168.0.1和192.168.0.2)访问
我拥有* .mydomain.com的通配ssl证书。它已正确安装在相关商店中(即,“个人”用于加密,“可信客户端”用于身份验证)
我希望两台服务器都使用通配符证书在其本地网络地址上相互连接以进行身份验证。
我已经更新了C:\ Windows \ System32 \ drivers \ etc \ hosts文件,使其看起来像这样:
192.168.0.1 Server1.mydomain.com
192.186.0.2 Server2.mydomain.com
这些不是我解析Server1.mydomain.com时获得的IP地址(我宁愿获得foo.1-2)
我还将IPV4本地接口(interface)的连接特定的DNS后缀编辑为“mydomain.com”
我的证书在Server.config文件中是这样引用的(我剥离了所有与身份验证无关的部分)
<behavior name="ServerToServerBehavior" >
<serviceCredentials>
<clientCertificate>
<authentication certificateValidationMode="PeerOrChainTrust" revocationMode="Online"/>
</clientCertificate>
<serviceCertificate x509FindType="FindByThumbprint" findValue="13a41b3456e431131cd461de"/>
</serviceCredentials>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="myServerAsClientBehaviorConfiguration">
<clientCredentials>
<clientCertificate x509FindType="FindByThumbprint" findValue="13a41b3456e431131cd461de" storeLocation="LocalMachine"/>
<serviceCertificate>
<authentication certificateValidationMode="PeerOrChainTrust" revocationMode="Online" trustedStoreLocation="LocalMachine"/>
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
在我自己的具有本地生成的X509证书的开发计算机上,这可以很好地工作,但是在生产环境中,这是我得到的:
Server.Connect:无法连接到
服务器Server2:
System.ServiceModel.Security.MessageSecurityException:
身份检查失败,无法传出
信息。的预期DNS身份
远程端点是
“server2.mydomain.com”,但远程
端点提供的DNS声明
“mydomain.com”。如果这是一个
合法的远程端点,您可以
通过显式解决问题
指定DNS身份“mydomain.com”
作为的身份属性
创建频道时的EndpointAddress
代理。
我试图让服务器回答Server2.mydomain.com而不只是mydomain.com,但没有成功。关于如何执行此操作的任何提示?
我还尝试了错误消息中建议的解决方案,但这似乎根本没有任何效果(其他用户似乎有the same problem,并且我还没有找到解决方案)。有关如何解决此问题的任何想法?
编辑:
我已经与我的证书提供者确认我确实可以将其用于X509身份验证。
最佳答案
我最终了解了为什么我的身份字段被忽略。
我的端点是这样构造的:
DistantServer = new ServiceReferenceServerToServer.ServerToServerClient("myServerBinding", "net.tcp://server.mydomain.com/Server");
当提供uri参数时,DNS身份字段(在app.config中定义)也会被覆盖(即使它为空,当我们使用字符串而不是真实的URI对象时也是如此)。
解决方案是使用以下代码以编程方式对其进行设置:
System.ServiceModel.EndpointAddress uri = new System.ServiceModel.EndpointAddress(new Uri("net.tcp://server.mydomain.com/Server"),new System.ServiceModel.DnsEndpointIdentity("mydomain.com"),new System.ServiceModel.Channels.AddressHeader[0]);
DistantServer = new ServiceReferenceServerToServer.ServerToServerClient("myServerBinding", uri );