我正在使用WCF进行一些测试,我们目前有以下服务器设置(简化配置):
<netTcpBinding>
<binding name="netTcp" ... >
<security mode="Transport">
<transport clientCredentialType="None"/>
</security>
</binding>
</netTcpBinding>
...
<serviceBehaviors>
<behavior name="defaultServiceBehavior">
<serviceCredentials>
<serviceCertificate
findValue="OurCert"
storeLocation="LocalMachine"
storeName="My"
x509FindType="FindBySubjectName"/>
</serviceCredentials>
</behaviour>
</serviceBehaviors>
以下客户端配置:
<endpointBehaviors>
<behavior name="NoRevNoValid">
<clientCredentials>
<serviceCertificate>
<authentication certificateValidationMode="None"
revocationMode="NoCheck"/>
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
因此,我们的想法是服务器证书用于加密数据,但客户端并不打算验证证书(客户端无论如何都不会拥有证书的CA)。
但是,此配置不会阻止客户端验证证书。它仍然试图走信任链并寻找撤销列表。
我找到了这个链接stating that the certificateValidationMode attribute does NOT apply to net.tcp bindings。
我已经看过处理 ServicePointManager.ServerCertificateValidationCallback 事件,但是再次看来这只适用于基于Http的绑定。
可能这些都是因为在使用net.tcp绑定时,传输安全性是否超出了应用程序的范围?
是否还有其他方法可以强制验证证书?
答案 0 :(得分:2)
经过大量测试后,似乎说明certificateValidationMode属性不适用于net.tcp绑定的链接是错误的!
此选项仍适用于net.tcp绑定。
但是,仍然会加载用于net.tcp传输安全性的证书,并且仍尝试解析其CA和CRL。我使用的证书包含CRL和CA的URL,因此证书存储每次都要解决这些问题(URL不可用),即使WCF配置然后说要忽略证书是否无效。
所以答案是WCF配置certificateValidationMode仍然适用,只是证书仍将由证书存储“解析”。对于大多数人来说,这不应该是一个大问题,但我将对证书所具有的URL进行一些进一步的测试,因为这些会导致我们在连接期间出现主要的延迟问题。
答案 1 :(得分:0)
在我的案例中使用CertificateValidator = X509CertificateValidator.None帮助:
非工作代码:
var handler = new Saml2SecurityTokenHandler();
var configuration = new SecurityTokenHandlerConfiguration
{
RevocationMode = X509RevocationMode.NoCheck,
CertificateValidationMode = X509CertificateValidationMode.None
};
handler.ValidateToken(saml2Token) gives a exception:
X.509证书CN = cn.name.com连锁建筑失败。使用的证书具有无法验证的信任链。替换证书或更改certificateValidationMode。已处理证书链,但终止于信任不信任的根证书。
工作代码:
var handler = new Saml2SecurityTokenHandler{CertificateValidator = X509CertificateValidator.None};
var configuration = new SecurityTokenHandlerConfiguration();