【问题标题】:WCF net.tcp transport security - how to disable server certificate validation on the clientWCF net.tcp 传输安全 - 如何在客户端禁用服务器证书验证
【发布时间】:2011-12-16 10:32:46
【问题描述】:

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

是否有其他方法可以强制不进行证书验证?

【问题讨论】:

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


    【解决方案1】:

    经过大量测试,表明 certificateValidationMode 属性不适用于 net.tcp 绑定的链接似乎是错误的!

    此选项仍适用于 net.tcp 绑定。

    但是,用于 net.tcp 传输安全的证书仍在加载,并且仍在尝试解析其 CA 和 CRL。我使用的证书包含 CRL 和 CA 的 URL,因此证书存储每次都会解决这些问题(URL 不可用),即使 WCF 配置当时说忽略证书是否无效。

    所以答案是 WCF 配置 certificateValidationMode 仍然适用,只是证书仍将由证书存储“解析”。对于大多数人来说,这应该不是一个大问题,但我将对证书所具有的 URL 做一些进一步的测试,因为这些会导致我们在连接过程中出现严重的延迟问题。

    【讨论】:

    • 您使用的是自签名证书吗?
    • 它实际上是从域控制器证书颁发机构创建的测试证书,因此 CRL 和 CA 条目具有指向该控制器的 URL,但这些 URL 实际上不再解析。
    【解决方案2】:

    在我的情况下,使用 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();
    

    【讨论】:

      猜你喜欢
      • 2012-01-28
      • 1970-01-01
      • 2012-02-25
      • 1970-01-01
      • 2015-08-17
      • 1970-01-01
      • 2016-05-24
      • 2013-01-23
      • 1970-01-01
      相关资源
      最近更新 更多