我遇到的情况与此问题中描述的情况几乎相同,但我的问题略有不同。
- 我正在使用安全性设置为TransportWithMessageCredential的NetTcpBinding。
- 我正在使用由ASP.NET提供程序支持的密码/用户名凭据。
- 我的服务是托管在Windows Service中的自托管应用程序程序。
- 我在我的终结点行为中指定了身份验证revocationMode ="NoCheck"。
<serviceCertificate findValue="***"
storeLocation="CurrentUser"
storeName="My"
x509FindType="FindByThumbprint"/>
现在,我有点想象客户最终会拥有
<identity>
<certificate encodedValue="encoded certificate"/>
</identity>
它将能够验证服务的凭据,而无需在客户机上安装该证书。
我很惊讶地发现,尽管我将服务凭据设置为证书,但WSDL仍然公开了
<Identity>
<Dns>Foo</Dns>
</Identity>
在服务中,我可以将Identity设置为CertificateReference,并将其连接到同一证书,然后WSDL将把身份公开为X509Certificate,但是当我运行客户端时,该设置被忽略,我最终会遇到错误消息:
System.ServiceModel.Security.SecurityNegotiationException: X.509证书CN=xxx不在受信任的人员存储中。X.509 证书CN=xxx链构建失败。使用的证书具有无法 验证的信任链。替换证书或更改certificateValidationMode。 证书链已经被处理,但是以根证书结束,而这个根证书不被信任提供商所信任。
是否有一种方法可以使客户端使用配置文件中的值并且无需在客户机上安装服务证书(也不需要安装其根证书)而正常工作?
[更新] 将certificateValidationMode设置为none可以消除异常,但从安全角度来看,这是不可接受的解决方案。
它只是让客户端承认“某个”证书而没有进一步细节。这使得所有的中间人攻击都成为可能。它仍然不会验证在配置文件中转储的证书针对(被指控的)服务发送的信息。