Invoke-WebRequest: Es konnte kein geschützter SSL/TLS-Kanal erstellt werden

    TLS-Problematik bei Windows PowerShellWer mit Invoke-WebRequest Web-Inhalte abrufen will, kann an einem SSL/TLS-Fehler scheitern. Der Grund liegt darin, dass immer mehr Websites die Version 1.0 des Proto­kolls ablehnen. In Windows Power­Shell muss man dann, je nach Version des installierten .NET-Frameworks, TLS 1.1 / 1.2 manuell aktivieren.

    Betroffen davon ist in erster Linie das Cmdlet Invoke-WebRequest, das wie curl oder wget Web-Inhalte von der Kommando­zeile herunterladen kann. Im Unterschied zu diesen beiden anderen Tools parst das Cmdlet die übertragenen HTML-Daten und macht sie als PowerShell-Objekt zugänglich.

    Kein Parameter für TLS-Version

    Unter Windows PowerShell fehlt ihm allerdings eine Möglichkeit, um die Version von TLS festzulegen, wogegen es dafür unter PowerShell 7 den Parameter SslProtocol gibt.

    Wenn PowerShell auf einer älteren Version des .NET-Framework als 4.62 läuft, dann nutzt es standard­mäßig TLS 1.0. Dies trifft auf Windows 8.1, Server 2016 und ältere Versionen von Windows 10 zu.

    Dort tritt abhängig von den Anforderungen der Gegenstelle häufig folgender Fehler auf:

    Invoke-WebRequest: Die Anfrage wurde abgebrochen: Es konnte kein geschützter SSL/TLS-Kanal erstellt werden.

    Wenn die Gegenseite TLS 1.0 nicht akzeptiert, dann kann es je nach OS bei Invoke-WebRequest zu einem Fehler kommen.

    Behelfen kann man sich in dieser Situation mit dem Aufruf von

    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]'Tls11,Tls12'

    Damit beschränkt man die TLS-Versionen auf 1.1 und 1.2. Diese Änderung wirkt sich jedoch nur auf die jeweilige Session aus, so dass man diesen Befehl jedes Mal neu eingeben müsste. Um das zu vermeiden, kann man ihn in das PowerShell-Profil aufnehmen.

    PowerShell 7 nicht betroffen

    Das Problem stellt sich hingegen nicht in PowerShell 6.x oder 7, und zwar nicht nur, weil man dort die TLS-Version für Invoke-WebRequest mit dem Parameter SslProtocol steuern kann. Vielmehr verwendet das darunterliegende .NET Core per Voreinstellung eine neuere Version des Protokolls.

    PowerShell 7 nutzt automatisch eine neuere Version von TLS

    Entsprechend könnte man auf den älteren Betriebs­systemen für Aufgaben, die eine TLS-Verbindung benötigen, auch auf PowerShell 7 ausweichen.

    Keine Kommentare