WCF服务证书和客户端端点身份 - 为什么它不起作用?

Krz*_*mic 10 security wcf certificate

[更新] - 我还附上完整的配置文件,服务客户端(在这里之外,不要泛滥主题)

我的情况与这个问题中概述的情况非常相似,但我的问题有些不同.

  • 我正在使用NetTcpBinding,其安全性设置为TransportWithMessageCredential
  • 我正在使用ASP.NET提供程序备份的密码/用户名凭据
  • 我的服务是在Windows服务中自托管的
  • 确实在我的端点行为中指定了身份验证revocationMode ="NoCheck"

要求服务提供证书以向客户端验证自身.那没关系,我只是这样做:

<serviceCertificate findValue="***"
                    storeLocation="CurrentUser"
                    storeName="My"
                    x509FindType="FindByThumbprint"/>
Run Code Online (Sandbox Code Playgroud)

现在,我有点想象现在客户最终会有

<identity>
  <certificate encodedValue="encoded certificate"/>
</identity>
Run Code Online (Sandbox Code Playgroud)

并且它将能够验证服务的凭证,而无需在客户端计算机上的商店中安装该证书.

我很惊讶发现虽然我将服务凭证设置为证书,但WSDL会暴露出来

<Identity>
   <Dns>Foo</Dns>
</Identity>
Run Code Online (Sandbox Code Playgroud)

同样,在服务上我可以将Identity设置为CertificateReference并将其挂钩到相同的证书,然后WSDL将身份公开为X509Certificate,但是当我运行客户端时忽略该设置,并且我最终得到错误消息:

System.ServiceModel.Security.SecurityNegotiationException:X.509证书CN = xxx不在受信任的人员存储中.X.509证书CN = xxx链建立失败.使用的证书具有无法验证的信任链.替换证书或更改certificateValidationMode.已处理证书链,但终止于信任提供程序不信任的根证书.

有没有办法让客户端从配置和工作中使用该值而无需在客户端的机器上安装服务证书(也不是它的根目录)?

[更新] 虽然将certificateValidationMode设置为none会使异常消失,但从安全角度来看这是不可接受的解决方案.

它使客户只是承认它收到"某些"证书,而没有详细说明.这使得所有中间人攻击都成为可能.它仍然不会根据配置中转储的证书验证(涉嫌)服务发送的信息.

Ped*_*lix 4

解决方案草图:

1)在客户端定义并注册一个自定义的X509CertificateValidator

2) 在Validate方法中,将给定证书与客户端EndpointAddress.Identity属性中存在的证书进行比较。此属性引用的对象应具有X509CertificateEndpointIdentity确切类型。

我没有测试这个解决方案,但它对我来说非常有意义。

HTH 佩德罗