2009-11-16 15 views
113

Ich dachte wirklich, ich hätte dieses Problem behoben, aber es wurde nur vorher getarnt.Lösung "Konnte Vertrauensbeziehung für den sicheren SSL/TLS-Kanal mit Autorität nicht herstellen"

Ich habe einen WCF-Dienst in IIS 7 mit HTTPS gehostet. Wenn ich zu dieser Site in Internet Explorer blättern, funktioniert es wie ein Charme, weil ich das das Zertifikat dem lokalen Stammzertifikatsautoritätsspeicher hinzugefügt habe.

Ich bin auf 1 Maschine entwickeln, so Client und Server sind die gleiche Maschine. Das Zertifikat ist selbst unterzeichnet direkt von IIS 7 Management-Snap in.

ich immer wieder diesen Fehler jetzt ...

kann keine Vertrauensstellung für den sicheren SSL/TLS-Kanal mit Behörde ein.

... wenn von der Client-Konsole aus aufgerufen.

Ich gab mir manuell Berechtigungen und Netzwerk-Service für das Zertifikat, mit findprivatekey und cacls.exe.

Ich habe versucht, eine Verbindung mit dem Dienst mit SOAPUI, und das funktioniert, so muss es ein Problem in meiner Client-Anwendung sein, die Code basiert auf, was früher mit http arbeitete.

Wo sonst kann ich aussehen Ich habe alle Möglichkeiten ausgeschöpft, warum ich keine Verbindung herstellen kann?

+0

möglich Duplikat verwaltet werden [konnte keine Vertrauensstellung für SSL/TLS sicheren Kanal einzurichten - SOAP] (http://stackoverflow.com/questions/703272/could-not- setest-trust-relationship-for-ssl-tls-secure-channel-soap) – jww

+0

Wenn Sie die Erstellung der Zertifikate kontrollieren, vergessen Sie nicht "Alternativer Antragstellername". Wie könnte man eine Wildcard in "* .full.domainname.com" setzen. Siehe https://www.digicert.com/subject-alternative-name.htm – granadaCoder

Antwort

170

Als Abhilfe können Sie ServerCertificateValidationCallback auf der Client-Seite einen Handler die ServicePointManager ‚s könnte hinzufügen:

System.Net.ServicePointManager.ServerCertificateValidationCallback += 
    (se, cert, chain, sslerror) => 
     { 
      return true; 
     }; 

aber bewusst sein, dass dies ist keine gute Praxis wie es vollständig den Server ignoriert Zertifikat und teilt dem Servicepunkt-Manager mit, dass ein beliebiges Zertifikat in Ordnung ist, das die Client-Sicherheit ernsthaft gefährden kann. Sie könnten dies verfeinern und einige benutzerdefinierte Prüfungen durchführen (für Zertifikatsnamen, Hash usw.). können Sie Probleme bei der Entwicklung umgehen, wenn Sie Testzertifikate verwenden.

+9

Ich denke, dass die meisten öffentlichen Setups ein gekauftes Cert verwenden werden, aber während der Entwicklung den obigen Code in bedingten #if-Anweisungen verwenden. Unternehmensentwickler sollten im Allgemeinen einen internen CA-Server einrichten >> http://technet.microsoft.com/en-us/library/cc875810.aspx –

+2

Hat mir geholfen herauszufinden, wie ich meinen SSL-WCF-Anruf mit Fiddler2 zum Debuggen funktioniere. –

+1

@ karank Ziehen Sie in Betracht, es in Global_asax in die Application_Start-Methode zu versetzen (siehe http://stackoverflow.com/a/12507094/1175419). Ich würde dringend empfehlen, eine #if DEBUG Compiler-Direktive oder etwas Ähnliches zu verwenden, wie in Lukes Kommentar erwähnt. –

17

Ihr Problem tritt auf, weil Sie einen selbstsignierten Schlüssel verwenden. Der Client vertraut diesem Schlüssel nicht, noch stellt der Schlüssel selbst eine zu validierende Kette oder eine Zertifikatsperrliste bereit.

Sie haben ein paar Optionen - Sie auf der Client (schlechter Zug, ein Mann in den Middle-Angriffe gibt es zuhauf)

  • Verwendung makecert

    1. Abschaltzeit Zertifikatsüberprüfung kann eine Wurzel erstellen CA und Zertifikate erstellen (OK Verschieben, aber es gibt immer noch keine CRL)

    2. Erstellen Sie eine interne Stamm-CA mit Vertrauen Windows Certificate Server oder andere PKI-Lösung dann diese Wurzel cert (ein bisschen wie ein Schmerz zu verwalten)

    3. Kauf ein SSL-Zertifikat von einer der vertrauenswürdigen Zertifizierungsstellen (teuer)

  • +3

    In Bezug auf (4), [StartSSL] (http://www.startssl.com/) wird Ihnen tatsächlich eine kostenlose Class 1-Zertifikat, das in allen gängigen Browsern funktioniert. Sie funktionieren gut für mich für mein halbes Dutzend Websites mit niedriger Bandbreite. – moodboom

    +0

    Ich denke # 2 auf dieser Liste ... diese URL könnte helfen: https://blogs.technet.microsoft.com/jhoward/2005/02/02/how-to-use-makecert-for-trusted-root- certification-authority-and-ssl-certificate-issuance/# comment-34025 "Verwendung von MakeCert für vertrauenswürdige Stammzertifizierungsstellen und SSL-Zertifikate" – granadaCoder

    +1

    Hinweis: StartCom ist nicht mehr vertrauenswürdig - und wurde gerade aus Chrome https entfernt: //en.wikipedia.org/wiki/StartCom –

    -6
    Fügen sie diese auf Ihren Client-Code

    :

    ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(
        delegate 
        { 
         return true; 
        }); 
    
    +1

    wo im Client-Code sollte dies hinzugefügt werden? –

    +3

    Diese Antwort ist nicht sehr gut, da sie nicht die mit dem Code verbundenen Risiken erklärt. – daveD

    9

    traf ich das gleiche Problem, und ich war in der Lage, es zu lösen mit zwei Lösungen: F Zuerst verwendete ich das MMC-Snap-In "Zertifikate" für das "Computerkonto" und zog das selbstsignierte Zertifikat in den Ordner "Vertrauenswürdige Stammzertifizierungsstellen". Dies bedeutet, dass der lokale Computer (derjenige, der das Zertifikat generiert hat) nun diesem Zertifikat vertraut. Zweitens bemerkte ich, dass das Zertifikat für einen internen Computernamen generiert wurde, aber auf den Webdienst wurde mit einem anderen Namen zugegriffen. Dies führte zu einer Nichtübereinstimmung bei der Validierung des Zertifikats. Wir haben das Zertifikat für computer.operations.local generiert, aber mit https://computer.internaldomain.companydomain.com auf den Web-Service zugegriffen. Als wir die URL auf die zum Generieren des Zertifikats verwendete URL umgestellt haben, sind keine Fehler mehr aufgetreten.

    Vielleicht hätte nur das Umschalten von URLs funktioniert, aber indem Sie das Zertifikat vertrauenswürdig machen, vermeiden Sie auch den roten Bildschirm in Internet Explorer, wo es Ihnen sagt, dass es dem Zertifikat nicht vertraut.

    3

    Ich hatte ähnliches Problem mit selbstsignierten Zertifikat. Ich könnte es auflösen, indem ich den Zertifikatsnamen wie FQDN des Servers benutze.

    Im Idealfall sollte SSL-Teil auf der Serverseite verwaltet werden. Der Client muss kein Zertifikat für SSL installieren. Auch einige der erwähnten Posts über das Umgehen des SSL vom Client-Code. Aber ich stimme überhaupt nicht damit überein.

    19

    das beide erste Einsatz Lambda, verwendet die dritte regelmäßigen Code ... hoffen, dass Sie es nützlich finden

      //Trust all certificates 
          System.Net.ServicePointManager.ServerCertificateValidationCallback = 
           ((sender, certificate, chain, sslPolicyErrors) => true); 
    
          // trust sender 
          System.Net.ServicePointManager.ServerCertificateValidationCallback 
           = ((sender, cert, chain, errors) => cert.Subject.Contains("YourServerName")); 
    
          // validate cert by calling a function 
          ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateRemoteCertificate); 
    
        // callback used to validate the certificate in an SSL conversation 
        private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors policyErrors) 
        { 
         bool result = false; 
         if (cert.Subject.ToUpper().Contains("YourServerName")) 
         { 
          result = true; 
         } 
    
         return result; 
        } 
    
    +1

    // Allen Zertifikaten vertrauen System.Net.ServicePointManager.ServerCertificateValidationCallback + = (se, cert, Kette, sslerror) => { Rückgabe true; }; // Vertrauen Absender System.Net.ServicePointManager.ServerCertificateValidationCallback + = (se, cert, Kette, sslerror) => { return cert.Subject.Contains ("ca-l-9wfvrm1.ceridian.ca "; }; – VoodooChild

    +0

    Jeder Cracker könnte ein Zertifikat fälschen, das alle oben genannten Tests bestanden hat. Das ist unsichere. –

    32

    Wenn ich dieses Problem ist es, weil die client.config wie seine Endpunkte hatte:

    https://myserver/myservice.svc 
    

    aber das Zertifikat erwartete

    https://myserver.mydomain.com/myservice.svc 
    

    die Endpunkte ändern übereinstimmen Der FQDN des Servers behebt mein Problem. Ich weiß, dass dies nicht die einzige Ursache für dieses Problem ist.

    +0

    Ich hatte gerade dieses Problem wieder und dieses Mal musste es mit dem falschen Zertifikat verwendet werden. Es scheint wie in beiden Fällen Es hat damit zu tun, dass Namen richtig abgeglichen werden. –

    +3

    Meine automatisch generierte Konfiguration hatte knightscharge

    3

    Ich habe gerade das Zertifikat in den Ordner "Trusted Root Certification Authorities" gezogen und voila hat alles gut funktioniert.

    Oh. Und fügte ich zuerst die folgenden von einem Prompt Administrator Befehl:

    netsh http add urlacl url=https://+:8732/Servicename user=NT-MYNDIGHET\INTERAKTIV 
    

    Ich bin nicht sicher, ob der Name, den Sie für den Benutzer benötigen (bei mir ist norwegisch wie Sie sehen können!): user=NT-AUTHORITY/INTERACTIVE?

    Sie können alle vorhandenen urlacl sehen, mit dem folgenden Befehl: netsh http show urlacl

    0

    Dies geschah, wenn sie über an den WCF-Dienst zu verbinden versucht. die IP z.B. https://111.11.111.1:port/MyService.svc, während ein Zertifikat verwendet wird, das an einen Namen gebunden ist, z. mysite.com.

    Die Umstellung auf die https://mysite.com:port/MyService.svc löste es.

    6

    Bitte wie folgt vorgehen:

    1. öffnen Service-Link im Internet Explorer.

    2. Klicken Sie auf die in der Adressleiste angegebene Fehlermeldung und klicken Sie auf Zertifikate anzeigen.

    3. Überprüfung ausgestellt auf: Name.

    4. Nehmen Sie den erteilten Namen und ersetzen Sie localhost Erwähnung in Service und Client-Endpunkt Basisadresse mit einem voll qualifizierten Domänennamen (FQDN).

    Beispiel: https: // localhost : 203/SampleService.svc zu https: // INL-126166-.groupinfra.com: 203/SampleService.svc

    +0

    Großartig, danke für diese Antwort! Gelöst die Probleme, ohne Codeänderungen vorzunehmen. –

    3

    I hatte das gleiche Problem. Ich hatte auch CA-Zertifikate im lokalen Laden hinzugefügt, aber ich habe auf die falsche Art und Weise getan.

    Mit mmc-Konsole (Start -> Ausführen ->mmc) sollten Sie Zertifikate hinzufügen Snap-In als Service-Konto (das Dienstkonto von IIS Wahl) oder Computer-Konto (es fügt für jedes Konto auf der Maschine

    )

    hier ein Bild von dem, was ich rede Add snap-in for a service account or the computer account

    von hier jetzt können Sie Zertifikate von CAs (Vertrauenswürdige Stammzertifizierungsstellen und Intermediate CAs) hinzufügen und e Alles wird gut funktionieren

    1

    Dies ist beim Versuch aufgetreten, eine Verbindung zum WCF-Dienst herzustellen, indem nur der Hostname z. https://host/MyService.svc, während ein Zertifikat verwendet wird, das an einen Namen gebunden ist, z. host.mysite.com.

    Umschalten auf die und dies hat es gelöst.

    8

    Eine Ein-Zeilen-Lösung.Fügen Sie diese überall, bevor der Server auf der Client-Seite aufrufen:

    System.Net.ServicePointManager.ServerCertificateValidationCallback += delegate { return true; }; 
    

    Dies sollte nur zu Testzwecken verwendet werden, da der Client SSL/TLS-Sicherheitsüberprüfungen überspringen.

    +2

    Das funktioniert für mich. – JimiOr2

    +1

    Eine brillante Problemumgehung zum Testen. Wir verbrauchen einen Dienst, dessen Anbieter Sicherheit zur Hölle gemacht hat mit einer gewundenen Kette von Sicherheitszertifikaten und bis wir ihre wonky certs und Verkettung richtig arbeiten können, diese wor Karound ist das einzige, was uns erlaubt, weiter zu entwickeln. – markaaronky

    0

    Zusätzlich zu den obigen Antworten kann dieser Fehler auftreten, wenn Ihr Client die falsche TLS-Version ausführt, z. B. wenn der Server nur TLS 1.2 ausführt.

    Sie können das Problem beheben, indem Sie:

      ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; //tested in .NET 4.5 
    
    0

    fixiert Nur ein ähnliches Problem.

    Ich erkannte, dass ich einen Anwendungspool hatte, der unter einem Konto ausgeführt wurde, das nur Leseberechtigung über das Zertifikat hatte, das es verwendet wurde.

    Die .NET-Anwendung konnte das Zertifikat korrekt abrufen, aber diese Ausnahme wurde nur ausgelöst, wenn GetRequestStream() aufgerufen wurde.

    Zertifikate Berechtigungen können über MMC console

    Verwandte Themen