2010-09-21 8 views
14

Ich teste eine frühe Version eines von mir erstellten WCF-Webdienstes. Auf der Client-Seite, wenn ich VS verwende, um Service-Referenz hinzuzufügen, das alles funktioniert.So können Sie Zertifikatfehler vorübergehend mit WCF-Diensten stoppen

Aber wenn ich versuche, den Service, den ich den Fehler zu verwenden,

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

Wo die Sterne die IP-Adresse des Servers darstellen.

Wie auch immer auf dem Server gibt es ein Sicherheitszertifikat, aber es wurde nur zum Testen selbst erstellt, so dass ich mich im Moment nicht um Zertifikatsfehler kümmern muss.

Auf der Client-Seite ein app.config für mich generiert wurde,

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

Was Einstellungen muss ich vorübergehend ändern müssen, um Zertifikat Fehler ignorieren?

Antwort

26

Legen Sie die CertificatePolicy PRIOR fest, um den WCF-Dienst auf dem Client zu initialisieren. Hier ist, wie (nur einen Aufruf an die SetCertificatePolicy machen() -Methode einmal)

/// <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 Kommentar - "Remotes das Zertifikat zu validieren." : P –

+0

Hehe, das habe ich vorher nicht bemerkt. Es sah komisch aus. Ich habe es geändert. Vielen Dank! –

+0

Es scheint, als ob mein ValidateRemoteCertificate niemals aufgerufen wird ... irgendwelche Hinweise warum? – guiomie

3

Überprüfen Sie die Antwort auf diese Frage:

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

es gibt zwei mögliche Lösungen: 1. mit nur Config Einträge auf der Client-Seite oder 2. Verwenden Sie einen benutzerdefinierten Zertifikat-Validierer, der sowohl Code- als auch Konfigurationseinträge verwendet

3

Ändern der web.config-Arbeit ed für mich

Ich tat es mit Steve Ellingers Antwort und etwas googeln. Im Wesentlichen musste ich:

  • tell Manager von HTTP-Verbindungen Zertifikat zu verwenden, ohne Server-Hostnamen passenden Zertifikatnamen mit und ohne zu prüfen, ob das Zertifikat
  • ändert Endpunktverhalten auf Client-Seite, um widerrufen wurde Zertifikatsvalidierung

Hier werden die web.config-Schnipsel sind auszuschalten ...

<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

Danke, es hilft. Ich habe ein paar zusätzliche Informationen gefunden, siehe [WCF Gotcha: SSL-Validierung deaktivieren] (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> 

Das funktioniert für mich. Danke

2

Sie könnten auch mit diesem oneliner überschreiben.

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

einfach fügen Sie ihn in den Client-Konstruktor erzeugt WCF in 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; 
    }