Trotz der Einstellung von ServerCertificateValidationCallback konnte kein sicherer SSL / TLS-Kanal erstellt werden

83

Ich versuche, eine SSL / TLS-Verbindung zum Testserver mit selbstsigniertem Zertifikat herzustellen . Die Kommunikation über einen unsicheren Kanal verlief ohne Probleme.

Hier ist mein Beispielcode, den ich basierend auf diesen Lösungen geschrieben habe: Zulassen nicht vertrauenswürdiger SSL-Zertifikate mit HttpClient C # Zertifikatfehler ignorieren? .NET-Client, der eine Verbindung zur SSL-Web-API herstellt

ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;

var c = new HttpClient();
var r = c.GetAsync("https://10.3.0.1:8443/rest/v1").Result;
if (r.IsSuccessStatusCode)
{
    Log.AddMessage(r.Content.Get<string>());
}
else
{
    Log.AddMessage(string.Format("{0} ({1})", (int)r.StatusCode, r.ReasonPhrase));
}

habe auch versucht:

var handler = new WebRequestHandler();
handler.ServerCertificateValidationCallback = delegate { return true; };
var c = new HttpClient(handler);
...

und das

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

aber jedes Mal habe ich eine Ausnahme:

InnerException: System.Net.Http.HttpRequestException
   _HResult=-2146233088
   _message=An error occurred while sending the request.
   HResult=-2146233088
   IsTransient=false
   Message=An error occurred while sending the request.
   InnerException: System.Net.WebException
        _HResult=-2146233079
        _message=The request was aborted: Could not create SSL/TLS secure channel.
        HResult=-2146233079
        IsTransient=false
        Message=The request was aborted: Could not create SSL/TLS secure channel.
        Source=System
        StackTrace:
             at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
             at System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar)
        InnerException: 

Was mache ich falsch? Warum kann ich keine Verbindung zu diesem Server herstellen (der über ein ungültig selbstsigniertes Zertifikat verfügt)?

Marcin Konrad Ceglarek
quelle

Antworten:

161

Mit ServerCertificateValidationCallback machen Sie es richtig. Dies ist nicht das Problem, mit dem Sie konfrontiert sind. Das Problem, mit dem Sie konfrontiert sind, ist höchstwahrscheinlich die Version des SSL / TLS-Protokolls.

Wenn Ihr Server beispielsweise nur SSLv3 und TLSv10 anbietet und Ihr Client TLSv12 benötigt, wird diese Fehlermeldung angezeigt. Sie müssen lediglich sicherstellen, dass sowohl Client als auch Server eine gemeinsame Protokollversion unterstützen.

Wenn ich einen Client benötige, der eine Verbindung zu so vielen Servern wie möglich herstellen kann (anstatt so sicher wie möglich zu sein), verwende ich diesen (zusammen mit dem Festlegen des Validierungsrückrufs):

  ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
Wapac
quelle
1
Ich habe ein ähnliches Problem. Aufgrund des POODLE-Angriffs sind wir gezwungen, TLS 1.0 auf unserem Server herunterzufahren. Wenn ich das mache, funktioniert eine Drittanbieter-App nicht mehr. Das Dekompilieren des Assamblys zeigt einen ähnlichen Code wie Sie. Es verwendet webclientc.SendAsync anstelle von GetAsync. Wenn ich den Code zum Testen auf eine Konsole kopiere, kann ich den Fehler reproduzieren und durch Hinzufügen von ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 funktioniert er. Ich dachte, dass es eine Art Handshake zwischen Server und Client geben würde, um herauszufinden, welche TLS-Version verwendet werden soll. Warum wird 1.1 nicht automatisch ausgewählt, wenn 1.0 deaktiviert ist?
Engern
3
Vielen Dank! Hatte 3 Stunden damit zu kämpfen. Das Hinzufügen dieser Zeile hat es für mich getan:ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
Thomas T
1
Beachten Sie, dass in einer neueren Version von .NET dies standardmäßig aktiviert ist. Alles, was wir tun müssen, ist, die .NET-Version auf 4.6.1
martinh_kentico
1
Es bedeutet genau, dass es Ihnen egal ist, ob gültig oder nicht. Mit diesem Rückruf können Sie Sicherheitsüberprüfungen für dieses Zertifikat einfach vermeiden.
Wapac
1
Tolle Antwort, ich denke, dieser ServicePointManager.SecurityProtocolWert sollte vielleicht der Standard sein. Oder zumindest, dass es mehr Einsicht direkt in die ausgelöste Ausnahme geben sollte.
Tschad
28

Wir haben das gleiche Problem erst heute gelöst. Sie müssen lediglich die Laufzeitversion von .NET erhöhen

4.5.2 hat bei dem oben genannten Problem nicht funktioniert , während 4.6.1 in Ordnung war

Wenn Sie die .NET-Version beibehalten müssen, legen Sie fest

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
martinh_kentico
quelle
1
Welche der Varianten haben Sie verwendet und wie genau?
martinh_kentico
1
Ich habe eine .NET 4.5-Anwendung, die ab heute nicht mehr mit einer bestimmten SSL-Site funktioniert. Wenn ich zu 4.6.1 wechsle, funktioniert es gut, aber ich kann mich nicht wirklich ändern. Ich bin mir nicht sicher, was zu tun ist: |
Tsury
16

Nur als Folgemaßnahme für alle, die noch darauf stoßen - ich hatte die ServicePointManager.SecurityProfile-Optionen hinzugefügt, wie in der Lösung angegeben:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

Trotzdem wurde weiterhin der Fehler "Die Anforderung wurde abgebrochen: SSL / TLS-sicherer Kanal konnte nicht erstellt werden" angezeigt. Ich habe versucht, eine Verbindung zu einigen älteren Sprachservern mit HTTPS-SOAP-API-Schnittstellen herzustellen (z. B. Voicemail, IP-Telefonsysteme usw., die vor Jahren installiert wurden). Diese unterstützen nur SSL3-Verbindungen, wie sie vor Jahren zuletzt aktualisiert wurden.

Man würde denken, dass die Aufnahme von SSl3 in die Liste der SecurityProtocols hier den Trick machen würde, aber das tat es nicht. Die einzige Möglichkeit, die Verbindung zu erzwingen, bestand darin, NUR das Ssl3-Protokoll und keine anderen einzuschließen:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

Dann geht die Verbindung durch - scheint mir ein Fehler zu sein, aber dies hat bis vor kurzem keine Fehler bei Tools ausgelöst, die ich für diese Server bereitstelle, die es seit Jahren gibt - ich glaube, Microsoft hat damit begonnen, Systemänderungen einzuführen, die dies aktualisiert haben Verhalten zum Erzwingen von TLS-Verbindungen, sofern keine andere Alternative vorhanden ist.

Wie auch immer - wenn Sie immer noch auf einige alte Sites / Server stoßen, lohnt es sich, es auszuprobieren.

Jeff Lindborg
quelle
1
Wir haben ein CUCMPowerShell-Modul für die Verwendung der Cisco Unified Communications AXL-API über PowerShell. Ihre Antwort hat uns dabei geholfen, dieses Problem durch Hinzufügen zu beheben [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Ssl3. Vielen Dank! Der vollständige Code ist in der Invoke-CUCMSOAPAPIFunction
Chris Magnuson
2
@ Jeff - Schauen Sie sich den verlinkten Artikel an. Ich denke, es könnte erklären, warum Ssl3 nicht funktioniert hat, und schlägt zwei Möglichkeiten vor, Ssl3 wieder zu aktivieren. docs.microsoft.com/en-us/dotnet/framework/migration-guide/…
Scott
4

Verschieben Sie diese Zeile: ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

Vor dieser Zeile: HttpWebRequest request = (HttpWebRequest) WebRequest.Create (uri);

Ursprünglicher Beitrag: KB4344167 Sicherheitsupdate bricht TLS-Code

user2686690
quelle
1
Nachdem Sie alle oben genannten Schritte ohne Erfolg versucht hatten, war dies die Antwort: Der ServicePointManager muss festgelegt werden, bevor Sie die HttpWebRequest erstellen.
Henry Rusted
1

In meinem Fall wurde TLS1_2 sowohl auf dem Client als auch auf dem Server aktiviert, aber der Server verwendete MD5, während der Client es deaktivierte. Testen Sie also sowohl Client als auch Server auf http://ssllabs.com oder testen Sie mit openssl / s_client, um zu sehen, was passiert. Überprüfen Sie auch die ausgewählte Chiffre mit Wireshark.

user960567
quelle
1

TLS 1.0 und 1.1 sind jetzt End of Life. Ein Paket auf unserem Amazon-Webserver wurde aktualisiert, und wir haben diesen Fehler erhalten.

Die Antwort ist oben, aber Sie sollten nicht verwenden tlsoder tls11mehr.

Fügen Sie dies speziell für ASP.Net zu einer Ihrer Startmethoden hinzu.

        public Startup()
        {
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12;

aber ich bin sicher, dass so etwas in vielen anderen Fällen funktionieren wird.

Bluebaron
quelle
0

Wenn Sie einen neuen Domainnamen verwenden und alle oben genannten Schritte ausgeführt haben und immer noch der gleiche Fehler angezeigt wird, überprüfen Sie, ob Sie den DNS-Cache auf Ihrem PC löschen. Löschen Sie Ihren DNS für weitere Details.

Windows® 8

Führen Sie die folgenden Schritte aus, um Ihren DNS-Cache zu löschen, wenn Sie Windows 8 verwenden:

Drücken Sie auf Ihrer Tastatur Win + X, um das WinX-Menü zu öffnen.

Klicken Sie mit der rechten Maustaste auf Eingabeaufforderung und wählen Sie Als Administrator ausführen.

Führen Sie den folgenden Befehl aus:

ipconfig / flushdns

Wenn der Befehl erfolgreich ist, gibt das System die folgende Meldung zurück:

Die Windows IP-Konfiguration hat den DNS-Resolver-Cache erfolgreich geleert.

Windows® 7

Führen Sie die folgenden Schritte aus, um Ihren DNS-Cache zu löschen, wenn Sie Windows 7 verwenden:

Klicken Sie auf Start.

Geben Sie cmd in das Textfeld Suche im Startmenü ein.

Klicken Sie mit der rechten Maustaste auf Eingabeaufforderung und wählen Sie Als Administrator ausführen.

Führen Sie den folgenden Befehl aus:

ipconfig / flushdns

Wenn der Befehl erfolgreich ist, gibt das System die folgende Meldung zurück: Die Windows-IP-Konfiguration hat den DNS-Resolver-Cache erfolgreich geleert.

Michelle
quelle
ipconfig /flushdnsin C #?
Kiquenet
0

Ich bin auf diesen Thread gestoßen, weil ich auch den Fehler hatte. Es konnte kein sicherer SSL / TLS-Kanal erstellt werden. In meinem Fall habe ich versucht, über PowerShell auf eine Siebel-Konfigurations-REST-API zuzugreifen Invoke-RestMethod, und keiner der oben genannten Vorschläge hat geholfen.

Schließlich stolperte ich über die Ursache meines Problems: Der Server, mit dem ich Kontakt aufnahm, erforderte die Authentifizierung des Clientzertifikats.

Damit die Aufrufe funktionieren, musste ich dem Client-Zertifikat (einschließlich des privaten Schlüssels) den folgenden -CertificateParameter bereitstellen :

$Pwd = 'certificatepassword'
$Pfx = New-Object -TypeName 'System.Security.Cryptography.X509Certificates.X509Certificate2'
$Pfx.Import('clientcert.p12', $Pwd, 'Exportable,PersistKeySet')
Invoke-RestMethod -Uri 'https://your.rest.host/api/' -Certificate $Pfx -OtherParam ...

Hoffentlich kann meine Erfahrung jemand anderem helfen, der meinen besonderen Geschmack für dieses Problem hat.

paulf
quelle