2010-09-21 15 views
14

Estoy probando una pronta liberación de un servicio web WCF que he creado. En el lado del cliente cuando uso VS para 'agregar referencia de servicio', todo funciona.Cómo dejar de errores de certificado temporalmente con servicios WCF

Pero cuando trato de utilizar el servicio me sale el error,

Could not establish trust relationship for the SSL/TLS secure 
channel with authority ** 

donde las estrellas representan la dirección IP del servidor.

De todos modos en el servidor no es un certificado de seguridad, pero se ha auto generada sólo para las pruebas, así que no estoy preocupado por los errores de certificado por ahora.

En el lado del cliente un app.config se ha generado para mí,

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
     <bindings> 
      <wsHttpBinding> 
       <binding name="BindingName" closeTimeout="00:01:00" 
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
        bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
        maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
        messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" 
        allowCookies="false"> 
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
         maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
        <reliableSession ordered="true" inactivityTimeout="00:10:00" 
         enabled="false" /> 
        <security mode="Transport"> 
         <transport clientCredentialType="Windows" proxyCredentialType="None" 
          realm="" /> 
         <message clientCredentialType="Windows" negotiateServiceCredential="true" /> 
        </security> 
       </binding> 
      </wsHttpBinding> 
     </bindings> 
     <client> 
      <endpoint address="***************" 
       binding="wsHttpBinding" bindingConfiguration="BindingName" 
       contract="***************" name="BindingName"> 
       <identity> 
        <servicePrincipalName value="***************" /> 
       </identity> 
      </endpoint> 
     </client> 
    </system.serviceModel> 
</configuration> 

Entonces, ¿qué hacen los ajustes que necesito cambiar temporalmente a ignorar los errores de certificado?

Respuesta

26

Establecer la CertificatePolicy antes de inicializar su servicio WCF en el cliente. He aquí cómo (sólo hacer un método, una vez llamada al SetCertificatePolicy())

/// <summary> 
    /// Sets the cert policy. 
    /// </summary> 
    private static void SetCertificatePolicy() 
    { 
     ServicePointManager.ServerCertificateValidationCallback += ValidateRemoteCertificate; 
    } 

    /// <summary> 
    /// Certificate validation callback 
    /// </summary> 
    private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error) 
    { 
     if (error == SslPolicyErrors.None) 
     { 
      return true; // already determined to be valid 
     } 

     switch (cert.GetCertHashString()) 
     { 
      // thumbprints/hashes of allowed certificates (uppercase) 
      case "066CF9CAD814DE2097D368F22D3A7D398B87C4D6": 
      case "5B82C96685E3A20079B8CE7AFA32554D55DB9611": 

       Debug.WriteLine("Trusting X509Certificate '" + cert.Subject + "'"); 
       return true; 

      default: 
       return false; 
     } 
    } 
+0

Niza comentario - "mandos a distancia de la validación de certificados." : P –

+0

Jeje, no lo había notado antes. Se veía extraño. Lo cambie. ¡Gracias! –

+0

Parece que mi ValidateRemoteCertificate nunca se llama ... ¿Alguna pista de por qué? – guiomie

3

Modificación del trabajo web.config ed para mí

lo hice usando la respuesta de Steve Ellinger y algunas google. Esencialmente, tuve que:

  • tell gestor de conexiones HTTP Para usar el certificado sin cumplir ninguna nombre del certificado con el nombre de host del servidor, y sin comprobar si el certificado ha sido revocado
  • modificar el comportamiento del punto final en el lado del cliente con el fin para desactivar la validación de certificados

Aquí están los fragmentos web.config ...

<configuration> 

    <system.net> 
    <settings> 
     <servicePointManager checkCertificateName="false" checkCertificateRevocationList="false" /> 
    </settings> 
    </system.net> 

    <system.serviceModel> 
    <client> 
     <endpoint ... behaviorConfiguration="DisableServiceCertificateValidation" /> 
    </client> 

    <behaviors> 
     <endpointBehaviors> 
     <behavior name="DisableServiceCertificateValidation"> 
      <clientCredentials> 
      <serviceCertificate> 
       <authentication certificateValidationMode="None" 
           revocationMode="NoCheck" /> 
      </serviceCertificate> 
      </clientCredentials> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    </system.serviceModel> 

</configuration> 
+1

Gracias, ayuda. Encontré un poco de información adicional, ver [WCF Gotcha: Deshabilitar la Validación de SSL] (http://webservices20.blogspot.co.nz/2008/12/wcf-gotcha-disabling-ssl-validation.html) – cateyes

13
<configuration> 
    <system.net> 
    <settings> 
     <servicePointManager checkCertificateName="false" checkCertificateRevocationList="false" /> 
    </settings> 
    </system.net> 
</configuration> 

Esto funciona para mí. Gracias

2

También puede anular con este oneliner.

ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, errors) => true; 

simplemente pegarlo en el constructor cliente WCF generado en Reference.cs

[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] 
public partial class WebQuoteServiceClient : System.ServiceModel.ClientBase<Corp.Legal.Webservices.ServiceReference1.IWebQuoteService>, Corp.Legal.Webservices.ServiceReference1.IWebQuoteService { 

    public WebQuoteServiceClient() 
    { 
     ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, errors) => true; 
    } 
Cuestiones relacionadas