it-swarm.com.de

SSL/TLS-Sicherheitskanal konnte trotz der Einstellung von ServerCertificateValidationCallback nicht erstellt werden

Ich versuche, eine SSL/TLS-Verbindung zum Test-Server mit einem selbstsignierten Zertifikat herzustellen. Kommunikation über unsichere Kanäle funktionierte ohne Probleme.

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

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));
}

auch versucht dies:

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 ein ungültiges selbstsigniertes Zertifikat hat)

Mit ServerCertificateValidationCallback machen Sie es richtig. Dies ist nicht das Problem, dem Sie gegenüberstehen. 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, erhalten Sie diese Fehlermeldung. Sie müssen sicherstellen, dass für Client und Server eine gemeinsame Protokollversion unterstützt wird.

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 dies (zusammen mit dem Festlegen des Validierungs-Callbacks):

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

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 bekam ich immer noch den gleichen Fehler "Die Anforderung wurde abgebrochen: SSL/TLS-Kanal konnte nicht erstellt werden". Ich habe versucht, eine Verbindung zu älteren Voice-Servern mit HTTPS SOAP API-Schnittstellen herzustellen (d. H. Voicemail, IP-Telefonsysteme usw.). Diese unterstützen nur SSL3-Verbindungen, wie sie vor Jahren zuletzt aktualisiert wurden.

Man könnte meinen, SSl3 in die Liste der SecurityProtocols aufzunehmen, würde den Trick hier tun, aber das tat es nicht. Die einzige Möglichkeit, die Verbindung zu erzwingen, bestand darin, NUR das Ssl3-Protokoll aufzunehmen und keine anderen:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

Dann wird die Verbindung hergestellt - es scheint mir ein Fehler zu sein, aber dies hat erst kürzlich zu Fehlern auf Tools geführt, die ich für diese Server bereitstelle, die seit Jahren auf dem Markt sind Verhalten, um TLS-Verbindungen zu erzwingen, es sei denn, es gibt keine andere Alternative. 

Wie auch immer - wenn Sie immer noch gegen einige alte Sites/Server vorgehen, lohnt es sich, es zu versuchen.

11
Jeff Lindborg

Wir haben das gleiche Problem gerade heute gelöst, und Sie müssen nur die Laufzeitversion von .NET erhöhen

4.5.2 hat nicht funktioniert für uns mit dem obigen Problem, während 4.6.1 in Ordnung war

Wenn Sie die .NET-Version beibehalten müssen, setzen Sie diese Option

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

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: Sicherheitsupdate KB4344167 bricht TLS-Code

0
user2686690

Wenn Sie einen neuen Domänennamen verwenden und alle oben genannten Schritte ausgeführt haben und immer noch die gleiche Fehlermeldung erhalten, überprüfen Sie, ob Sie den DNS-Cache auf Ihrem PC löschen Löschen Sie Ihren DNS , um weitere Informationen zu erhalten Einzelheiten.

Windows® 8

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

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

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

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-Auflösungscache 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 im Suchfeld des Startmenüs cmd ein.

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

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-Auflösungscache erfolgreich geleert.

0
Aviva

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

Schließlich bin ich über die Ursache meines Problems gestolpert: Der Server, mit dem ich Kontakt hatte, benötigte die Authentifizierung des Clientzertifikats.

Damit die Anrufe funktionieren, musste ich das Clientzertifikat (einschließlich des privaten Schlüssels) mit dem Parameter -Certificate 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 jemandem helfen, der mein besonderes Flair für dieses Problem hat.

0
paulf