2010-09-21 10 views
14

Sto testando una versione anticipata di un servizio Web WCF che ho creato. Sul lato client quando uso VS per 'aggiungere riferimento al servizio' che tutto funziona.Come arrestare temporaneamente gli errori del certificato con i servizi WCF

Ma quando cerco di utilizzare il servizio ottengo l'errore,

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

dove le stelle rappresentano l'indirizzo IP del server.

In ogni caso sul server c'è un certificato di sicurezza ma è stato generato automaticamente solo per il test, quindi non sono preoccupato per gli errori del certificato per il momento.

Sul lato client un app.config è stato generato per me,

<?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> 

Così che cosa fanno le impostazioni ho bisogno di cambiare per ignorare temporaneamente gli errori del certificato?

risposta

26

Impostare CertificatePolicy PRIOR per inizializzare il servizio WCF sul client. Ecco come (basta fare una chiamata al SetCertificatePolicy() metodo di una volta)

/// <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

Nizza commento - "telecomandi Convalida certificato." : P –

+0

Hehe, non l'avevo notato prima. Sembrava strano. L'ho cambiato. Grazie! –

+0

Sembra che il mio ValidateRemoteCertificate non venga mai chiamato ... nessun indizio perché? – guiomie

3

Controllare la risposta a questa domanda:

How do I tell WCF to skip verification of the certificate?

dà due possibili soluzioni: 1. utilizzando solo config voci sul lato client o 2. utilizzare un convalida certificato personalizzato che utilizza sia il codice che le voci di configurazione

3

Modifica del lavoro web.config per me

L'ho fatto usando la risposta di Steve Ellinger e un po 'di google. In sostanza, ho dovuto:

  • raccontano responsabile di connessioni HTTP per utilizzare il certificato senza corrispondenza nome del certificato con il nome host del server, e senza verificare se il certificato è stato revocato
  • modificare il comportamento di endpoint sul lato client in modo per disattivare la convalida del certificato

Ecco i frammenti 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

Grazie, aiuta. Ho trovato alcune informazioni in più, vedi [WCF Gotcha: Disabilitazione della convalida 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> 

Questo funziona per me. Grazie

2

Si potrebbe anche eseguire l'override con questo oneliner.

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

incollarlo semplicemente al costruttore client WCF generato nel 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; 
    } 
Problemi correlati