WCF basicHttpBinding配置出现远程端点DNS身份校验失败问题求解
解决方案
1. 绑定算法配置验证
你之前修改的basicHttpBinding配置algorithmSuite="Basic256Sha256"已经满足算法要求:该算法套件默认使用rsa-sha256作为非对称签名算法、sha256作为摘要算法,规范化算法也和要求一致,无需额外调整。
2. 证书验证规则配置
仅需要在客户端终结点行为中配置验证规则,服务行为节点是服务端使用的,客户端配置不生效,App.config配置参考如下:
<behaviors> <endpointBehaviors> <behavior name="CustomClientBehavior"> <clientCredentials> <serviceCertificate> <authentication certificateValidationMode="None" revocationMode="NoCheck" /> </serviceCertificate> </clientCredentials> </behavior> </endpointBehaviors> </behaviors>
然后给客户端终结点绑定该行为:
<endpoint address="http://.../service" binding="basicHttpBinding" bindingConfiguration="你的绑定配置名" contract="服务引用生成的接口名" behaviorConfiguration="CustomClientBehavior" />
3. DNS身份校验错误修复
该错误是因为服务端证书的DNS声明和请求终结点默认预期的DNS不匹配,可任选一种方式修复:
方式一:代码配置终结点身份
创建客户端实例时手动指定匹配的DNS身份:
var serviceAddress = new EndpointAddress( new Uri("http://.../service"), EndpointIdentity.CreateDnsIdentity("nameB") ); var client = new 你的服务客户端类(serviceAddress);
方式二:App.config配置终结点身份
在endpoint节点下添加identity配置:
<endpoint address="http://.../service" binding="basicHttpBinding" bindingConfiguration="你的绑定配置名" contract="服务引用生成的接口名" behaviorConfiguration="CustomClientBehavior"> <identity> <dns value="nameB" /> </identity> </endpoint>
4. 客户端证书配置简化
不需要同时给ChannelFactory和ClientCredentials赋值,仅保留一处即可,推荐添加存储标识参数避免权限问题:
var cert = new X509Certificate2( Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "cert.p12"), "Pass", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet ); client.ClientCredentials.ClientCertificate.Certificate = cert; // 调试阶段可保留以下配置,生产环境必须替换为服务端正式公钥证书 client.ClientCredentials.ServiceCertificate.DefaultCertificate = cert;
注意:同一份证书同时用作客户端和服务端证书仅适合自签名测试场景,生产环境必须替换为服务端发放的独立公钥证书。
内容的提问来源于stack exchange,提问作者ITMemberAHE
相关产品推荐
相关产品推荐

