Powershell und Zertifikate Check

Ich liebe PowerShell und insbesondere Invoke-Webrueqest und Invoke-RESTMethod. Aber beide prüfen per Default die Gültigkeit der Zertifikate. Das ist im Prinzip richtig aber in Testumgebungen manchmal auch störend, wenn die Gegenseite eben kein gültiges Zertifikate hat. SO kann ich die Prüfung für die aktuelle Session abschalten

Der Fehler in Reinform

Ich habe dazu einen WebServer (in meinem Fall PRTG) mit einem selbstsignierten Zertifikat im LAN und wollte einfach eine Webseite abrufen. ein "Invoke-Webrequest" schlägt natürlich fehl mit dem Fehler:

Invoke-WebRequest : Die zugrunde liegende Verbindung wurde geschlossen: Für den geschützten SSL/TLS-Kanal konnte keine Vertrauensstellung hergestellt werden..

PS C:\> Invoke-WebRequest https://192.168.13.14
Invoke-WebRequest : Die zugrunde liegende Verbindung wurde geschlossen: Für den geschützten SSL/TLS-Kanal konnte keine
Vertrauensstellung hergestellt werden..

In der PowerShell ist das Fenster rot und eine Exception wird gestartet:

Ich kann den Fehler per Try/Catch (Siehe auch PowerShell Error Handling) abfangen aber die Daten der Webseite bekomme ich so doch nicht.

SSL-Prüfung abschalten

Nun funktionieren diese Aufrufe so, dass Sie im Fehlerfall eine "Callback"-Funktion aufrufen, die dem Modul die weitere Verarbeitung vorgibt. Per Default wird hier dann ein Fehler ausgegeben. Wenn ich das umgehen will, muss ich einfach eine eigene Funktion bereitstellen, die in dem Fall aufgerufen wird und ein beschwichtigendes OK liefert. Hier der entsprechende Code dazu:

Write-host "Disable Certificate checks"
Add-Type @"
    using System;
    using System.Net;
    using System.Net.Security;
    using System.Security.Cryptography.X509Certificates;
    public class ServerCertificateValidationCallback
    {
        public static void Ignore()
        {
            ServicePointManager.ServerCertificateValidationCallback += 
                delegate
                (
                    Object obj, 
                    X509Certificate certificate, 
                    X509Chain chain, 
                    SslPolicyErrors errors
                )
                {
                    return true;
                };
        }
    }
"@
[ServerCertificateValidationCallback]::Ignore();

Leider geht das nicht allein mit Powershell. Über den "Add-Type"-Befehl wird etwas C#-Code als Klasse "ServerCertificateValidationCallback" mit einer Methode "Ignore" definiert und aufgerufen. Dieses Beispiel gibt einfach "True" zurück und damit vertraue ich nun innerhalb dieses Skripts allen Zertifikaten:

Achtung: Damit hebeln Sie natürlich alle Schutzfunktionen aus und können nicht mehr sicher sein, dass Sie auf dem richtigen Server gelandet sind und niemand sich als "Man in the Middle" eingeschliffen hat. Dieses Vorgehen ist während der Entwicklung und Tests tolerierbar aber nicht mehr im Betrieb und erst recht nicht bei Verbindungen über ungesicherte Leitungen, insbesondere Internet oder zu Cloud-Anbietern.

Gleicher Abruf noch mal

Mit diesen Vorarbeiten klappt dann auch der Abruf trotz ungültigen Zertifikat.

Leider hat Microsoft den Commandlets "Invoke-WebRequest" und "Invoke-RestMethod" keinen Parameter spendiert, der die SSL-Prüfung steuert.

Weitere Links