WCF net.tcp传输安全性 - 如何在客户端上禁用服务器证书验证

时间:2011-10-27 11:19:49

标签: .net wcf .net-3.5 wcf-security

我正在使用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绑定时,传输安全性是否超出了应用程序的范围?

是否还有其他方法可以强制验证证书?

2 个答案:

答案 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();