Fehler „Es konnte kein geschützter SSL TLS Kanal erstellt werden“ lösen
Inhaltsverzeichnis
Was tun, wenn kein geschützter SSL TLS Kanal erstellt werden kann?
Du erhältst die Fehlermeldung „Es konnte kein geschützter SSL TLS Kanal erstellt werden“? Dann herzlich willkommen zum heutigen Beitrag, wo ich Dir eine mögliche Lösung zeigen werde. Ich selbst habe diese Fehlermeldung gestern bei einem Kundenprojekt bekommen, aber wusste zum Glück, was zu tun ist. Wenn man die Fehlermeldung das erste Mal sieht, kann man schon daran verzweifeln..
Als Video ansehen
Keine Lust auf viel Text? Kein Problem, schau Dir einfach das kurze Video an und löse Dein Problem in wenigen Sekunden.
Im Endeffekt ist die dazugehörige Lösung – egal ob bei VB.NET oder C# Applikation – häufig vermeintlich einfach. Grundsätzlich stolpert man gängiger weise in Kombination mit Web-Requests über diese Fehlermeldung. Das liegt natürlich daran, dass dort für das HTTP (S) Protokoll, eine gesicherte Verbindung aufgebaut wird. Schauen wir uns das im nächsten Schritt einmal genauer an!
Fehler nachstellen – „Konnte keinen SSL Kanal erstellen“
Gehen wir im nächsten Schritt einmal hin und stellen diesen Fehler der problemhaften SSL-Kanal-Erstellung nach. Aus dem Kopf heraus kann ich da glaube ich ein relativ einfaches Szenario zusammenstückeln. Beachte, dass es vermutlich noch einige andere Situationen geben wird, ich aber Diese hier konkret weiß..
Den Anfang findet das Ganze wie oben erwähnt – denke ich – am besten bei der NET Framework Version. Schalte also zunächst einfach die NET Framework Deines Projektes (wenn möglich) auf z. B. Version „4„. Im Video verwende ich hier ein älteres Projekt, wo ich den Fehler auch schon einmal hatte, wundere Dich also bitte nicht über den alten Code.
NET Framework Version des Projekts umstellen
💡 Hinweis: Verwende zum Testen ggf. ein separates Projekt, um nichts in Deinem aktuellen Projekt zu zerstören!
Um die .NET-Framework Version Deines Projektes umzustellen, kannst Du im Visual Studio einfach oben auf „Projekt->Eigenschaften“ gehen.
Gehe danach links auf den Reiter namens „Anwendung“ und wähle unter dem Punkt „Zielframework“ z. B. die Version 4. Anschließend wirst Du ggf. darum gebeten, die kommende Meldung zu bestätigen, Diese bestätigst Du dann einfach. Im nächsten Schritt wird dann mehr oder weniger alles durch Visual Studio umgestellt.
Aufruf und Exception
Im nächsten Schritt rufen wir dann einfach mal eine die Fehlermeldung (voraussichtlich) triggernde Funktion / Methode auf. Welche das ist / sind? Im ersten Schritt die Funktionen, Welche mit dem Netzwerk zu tun haben. Als Beispiel deklarieren wir daher einfach einen simplen „WebClient“ auf Form-Ebene und instanziieren Ihn im Konstruktor:
Public Class Form1 Private WithEvents _webClient As WebClient Sub New() _webClient = New WebClient() End Sub End Class
public class Form1 private WebClient _webClient; public Form1() { _webClient = new WebClient(); } End Class
Danach rufe ich z. B. die „DownloadString„-Methode des „WebClients“ mit einer passenden URL auf. Dabei kann es sich wie in meinem Beispiel, um eine normale Textdatei handeln, Welche nur einen schmalen String beinhaltet. Mein Aufruf sah dort z. B. wie folgt aus:
Dim version = "" Try version = wc.DownloadString("<URLToTextFileForExample>") Catch ex As Exception ' catch the error.. End Try
Anschließend hat der Code dann den benannten Fehler getriggert: „Es konnte kein geschützter SSL / TLS Kanal erstellt werden“:
Die Lösung!
Ich will mich mit diesem Beitrag durchaus nicht als „Profi“ in diesem Gebiet darstellen, jedoch möchte ich im Sinne Deiner Zeit-Einsparung berichten, wie es letztlich bei mir funktionierte. Selbstverständlich habe ich – so wie Du vermutlich vor einigen Sekunden – im Internet nach Problemlösungen gesucht.
Leider haben vorgeschlagene Methoden nicht funktioniert – bis ich dann die gleich Folgende heraus hatte. Es wurde vorgeschlagen, Code wie diesen hier, vor dem ersten Netzwerk-Aufruf zu setzen:
ServicePointManager.Expect100Continue = True ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls ServicePointManager.ServerCertificateValidationCallback = Function(sndr, cert, chain, sllPolicyErrors) True
Dafür würde sich natürlich ein Einstiegspunkt des Programmes, wie z. B. der „Load„-Ereignishandler der ersten Form, oder so etwas wie eine „Main-Methode“ eignen. Allerdings klappte das wie oben bereits erwähnt leider nicht wirklich.. Nach einiger Fummelei, habe ich dann herausgefunden, dass ich für meinen Fall nur eine Codezeile benötigte.
Ebenso musste ich das NET Framework hochsetzen, um die passende Codezeile verwenden zu können. Setze also Dein Zielframework (wenn hoffentlich möglich) auf „4.5“ und verwende diesen Code. Man beachte das hinten geänderte „Tls“ zu „Tls12“, Welches scheinbar erst ab NET Framework 4.5 (und laut Doku ab Win 7) verfügbar ist.
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
Fazit
Am Ende dieses Beitrages angekommen können wir nun also folgendes Fazit ziehen. Wenn man mit Netzwerk-Anfragen in Kombination mit einem selbst signierten SSL Zertifikat arbeitet, kann es Probleme geben. Besonders unsere verwendete NET Framework Version (4.0) hatte ein bekanntes „Problem„, bzw. einen bekannten Fehler.
Um diesen Fehler „Es konnte kein geschützter SSL TLS Kanal erstellt werden“ zu lösen, muss man das Transport-Protokoll umstellen. Dies kann man erledigen, indem man die Eigenschaft „SecurityProtocol“ der „ServicePointManager„-Klasse auf „Tls12“ setzt. Die Umstellung muss allerdings (irgendwo logisch) vor dem ersten netzwerkbezogenen Aufruf stattfinden.