代码之家  ›  专栏  ›  技术社区  ›  Mike Blandford

如何告诉WCF跳过证书验证?

  •  24
  • Mike Blandford  · 技术社区  · 16 年前

    试图使 web service 打电话给某人 HTTPS 我的端点 Silverlight 应用程序导致此错误:“找不到与绑定wshttpbinding的端点的方案https匹配的基地址。注册的基址方案是[http]“

    与这里发布的问题相同:

    http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/4c19271a-f5e6-4659-9e06-b556dbdcaf82/

    因此,其中一个建议是:“另一个问题可能是证书名和计算机名不一致,这导致了 WCF 合身如果是这种情况,您可以告诉WCF跳过对证书的验证。”

    嗯,我 获取证书错误,因为这只是一个演示服务器。

    以下是我如何设置我的客户:

    BasicHttpBinding binding = new BasicHttpBinding();
    binding.Security.Mode = BasicHttpSecurityMode.Transport;
    _ws = new AnnotationService.AnnotationClient(binding, new EndpointAddress(myAddress));
    

    我如何才能告诉WCF跳过验证?

    2 回复  |  直到 14 年前
        1
  •  33
  •   Enrico Campidoglio    14 年前

    您可以通过以下方式在Silverlight中实现此功能: 允许跨域通信 在Web服务器之间承载Silverlight应用程序和远程WCF服务。

    在这种情况下,你需要放置一个 clientaccesspolicy.xml 位于承载WCF服务的域根目录下的文件:

    <?xml version="1.0" encoding="utf-8"?>
    <access-policy>
      <cross-domain-access>
        <policy>
          <allow-from http-request-headers="SOAPAction">
            <domain uri="http://*"/>
          </allow-from>
          <grant-to>
            <resource path="/" include-subpaths="true"/>
          </grant-to>
        </policy>
      </cross-domain-access>
    </access-policy>
    

    这里是什么 MSDN states about this approach :

    允许访问HTTPS服务 来自托管的任何Silverlight控件 通过HTTP应用程序,您需要 这个 <域URI=__http:/// _/>*元素 在你的内心 <允许从… 元素。

    我自己也没试过,但值得一试。此外,请务必查看以下资源以了解更多详细信息:


    在.NET中禁用X.509证书验证

    对于.NET应用程序,此示例WCF配置将禁用对证书是否可信以及证书在客户端上是否仍然有效的验证:

    <system.serviceModel>
        <behaviors>
          <endpointBehaviors>
            <behavior name="DisableServiceCertificateValidation">
                <clientCredentials>
                    <serviceCertificate>
                        <authentication certificateValidationMode="None"
                                        revocationMode="NoCheck" />
                    </serviceCertificate>
                </clientCredentials>
            </behavior>
          </endpointBehaviors>
        </behaviors>
        <client>
          <endpoint address="http://localhost/MyService"
            behaviorConfiguration="DisableServiceCertificateValidation"
            binding="wsHttpBinding"
            contract="MyNamespace.IMyService"
            name="MyServiceWsHttp" />
        </client>
    </system.serviceModel>
    

    另一种解决方案 提供自定义逻辑以验证服务提供的X.509证书。在这种情况下,您必须根据以下内容修改配置文件:

    <system.serviceModel>
        <behaviors>
          <endpointBehaviors>
            <behavior name="DisableServiceCertificateValidation">
                <clientCredentials>
                    <serviceCertificate>
                        <authentication certificateValidationMode="Custom"
                                        customCertificateValidatorType="MyCertificateValidator, Client"
                                        revocationMode="NoCheck" />
                    </serviceCertificate>
                </clientCredentials>
            </behavior>
          </endpointBehaviors>
        </behaviors>
        <client>
          <endpoint address="http://localhost/MyService"
            behaviorConfiguration="DisableServiceCertificateValidation"
            binding="wsHttpBinding"
            contract="MyNamespace.IMyService"
            name="MyServiceWsHttp" />
        </client>
    </system.serviceModel>
    

    然后创建一个派生自 X509CertificateValidator 实现自定义验证逻辑。

    public class MyCertificateValidator : X509CertificateValidator
    {
        public override void Validate(X509Certificate2 certificate)
        {
            // Add custom validation logic
            // Throw an exception to fail validation
        }
    }
    

    一如既往,你可以找到 a more detailed example 在MSDN上。

        2
  •  2
  •   joshperry    16 年前

    这看起来不像证书验证错误。似乎是WebService配置错误。可以在服务器上发布端点的配置吗?

    默认情况下,WCF服务不支持SSL,您需要通过创建绑定配置并使用binding configuration属性将端点指向它来启用传输安全性。

    以下是支持SSL的绑定配置示例:

    <bindings>
      <basicHttpBinding>
        <binding name="SecureTransport">
          <security mode="Transport">
            <transport clientCredentialType="None"/>
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    

    您的端点配置如下所示:

    <endpoint address=""
       binding="basicHttpBinding"
       bindingConfiguration="SecureTransport"
       contract="MyServices.IWebService" />