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

Mik*_*ord 24 silverlight https wcf http certificate

尝试在Silverlight应用程序中对HTTPS端点进行Web服务调用会导致此错误:"无法找到与绑定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));
Run Code Online (Sandbox Code Playgroud)

如何告诉WCF跳过验证?

Enr*_*lio 33

您可以通过允许 Web服务器,Silverlight应用程序的主机和远程WCF服务之间的跨域通信,在Silverlight中实现此目的.

在这种情况下,您需要将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>
Run Code Online (Sandbox Code Playgroud)

以下是MSDN对此方法的陈述:

要允许从通过HTTP应用程序托管的任何Silverlight控件访问HTTPS服务,您需要将<domain uri ="http:// "/>*元素放在<allow-from>元素中.

我自己没试过,但它值得一试.另外,请务必查看以下资源以获取更多详细信息:


在.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>
Run Code Online (Sandbox Code Playgroud)

另一种解决方案是提供自定义逻辑来验证服务提供的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>
Run Code Online (Sandbox Code Playgroud)

然后创建一个派生自X509CertificateValidator的类来实现自定义验证逻辑.

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

与往常一样,您可以在MSDN上找到更详细的示例.

  • 将明确说明:上面的代码是针对WFC客户端的;) (3认同)
  • 您是否知道跳过主机名检查的简单方法?如果它们不匹配,则仅使用这些设置仍然会失败. (2认同)