Powershell Invoke-WebRequest schlägt mit SSL / TLS Secure Channel fehl

254

Ich versuche, diesen Powershell-Befehl auszuführen

Invoke-WebRequest -Uri https://apod.nasa.gov/apod/

und ich bekomme diesen Fehler. "Invoke-WebRequest: Die Anforderung wurde abgebrochen: SSL / TLS-sicherer Kanal konnte nicht erstellt werden." https-Anfragen scheinen zu funktionieren (" https://google.com "), aber nicht diese. Wie kann ich dies zum Laufen bringen oder einen anderen Powershell-Befehl verwenden, um den Seiteninhalt zu lesen?

Hewstone
quelle
2
Siehe auch Standard-Sicherheitsprotokoll in .NET 4.5 .
Franklin Yu

Antworten:

536

versuche es mit diesem

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Invoke-WebRequest -Uri https://apod.nasa.gov/apod/
Chandan Rai
quelle
48
Standardmäßig verwendet Powershell TLS 1.0. Für die Site-Sicherheit ist TLS 1.2
Chandan Rai am
3
Awh, wie haben Sie die TLS-Version der Site ermittelt?
Hewstone
16
Versuchen Sie SSLLabs , um Informationen zu ermitteln: SSL-Bericht: apod.nasa.gov zeigt TLS1.1 und TLS1.2
Christopher G. Lewis
1
Gibt es eine Möglichkeit, dies etwas dauerhafter zu tun? Dies funktioniert, scheint jedoch mit jedem Konsolenfenster zurückgesetzt zu werden.
Brandon
3
@Brandon Ändern Sie es in der Registrierungstabelle$env:Profile oder bearbeiten Sie sie noch besser .
Franklin Yu
166

In einem schamlosen Versuch, einige Stimmen zu stehlen, SecurityProtocolist ein Enummit dem [Flags]Attribut. So können Sie Folgendes tun:

[Net.ServicePointManager]::SecurityProtocol = 
  [Net.SecurityProtocolType]::Tls12 -bor `
  [Net.SecurityProtocolType]::Tls11 -bor `
  [Net.SecurityProtocolType]::Tls

Da es sich um PowerShell handelt, können Sie eine Zeichenfolge für Sie analysieren lassen:

[Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls"

Dann müssen Sie die TLS-Version technisch nicht kennen.

Ich habe dies aus einem Skript kopiert und eingefügt, das ich nach dem Lesen dieser Antwort erstellt habe, da ich nicht alle verfügbaren Protokolle durchlaufen wollte, um eines zu finden, das funktioniert. Natürlich können Sie das tun, wenn Sie möchten.

Letzte Anmerkung - Ich habe die ursprüngliche Anweisung (minus SO-Änderungen) in meinem PowerShell-Profil, sodass sie in jeder Sitzung, die ich jetzt beginne, enthalten ist. Es ist nicht völlig narrensicher, da es immer noch einige Websites gibt, die einfach versagen, aber ich sehe die fragliche Nachricht sicherlich viel seltener.

Keine Rückerstattung Keine Rückgabe
quelle
7
Wenn Sie auf eine Site zugreifen müssen, die SSLv3 verwendet, möchten Sie [Net.ServicePointManager]::SecurityProtocol = "Tls12, Tls11, Tls, Ssl3". Denken Sie daran, dass SSLv3 und TLSv1.0 aufgrund von POODLE veraltet sind. Die Verwendung erfolgt daher auf eigenes Risiko.
Jordanbtucker
Gibt es nicht eine Möglichkeit, Reflection zu verwenden, um nur alle Net.SecurityProtocolType-Typen zuzulassen? es muss sein
red888
Warum möchten Sie standardmäßig den Zugriff auf Protokolle mit bekannten Fehlern zulassen? Unabhängig davon glaube ich, dass die bevorstehende Veröffentlichung von PowerShell V7 (zum Zeitpunkt dieses Schreibens) dieses Problem ein für alle Mal lösen wird und diese Frage langsam in ihre rechtmäßige und wohlverdiente Vergessenheit übergehen wird.
Keine Rückerstattung Keine Rückgabe
2

Wenn wie ich keines der oben genannten Verfahren ganz funktioniert, kann es sich lohnen, auch nur eine niedrigere TLS-Version auszuprobieren. Ich hatte beide der folgenden Möglichkeiten ausprobiert, schien mein Problem jedoch nicht zu lösen:

[Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls"
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 -bor [Net.SecurityProtocolType]::Tls11 -bor [Net.SecurityProtocolType]::Tls

Am Ende funktionierte es nur, als ich TLS 1.0 ins Visier nahm (insbesondere 1.1 und 1.2 im Code entfernen):

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls

Der lokale Server (auf dem dies versucht wurde) ist mit TLS 1.2 in Ordnung, obwohl der Remote-Server (der zuvor von einem Drittanbieter als in Ordnung für TLS 1.2 "bestätigt" wurde) nicht in Ordnung zu sein scheint.

Hoffe das hilft jemandem.

Mark-DG1
quelle
1

Für mich geht das...

if (-not ([System.Management.Automation.PSTypeName]'ServerCertificateValidationCallback').Type)
    {
    $certCallback = @"
        using System;
        using System.Net;
        using System.Net.Security;
        using System.Security.Cryptography.X509Certificates;
        public class ServerCertificateValidationCallback
        {
            public static void Ignore()
            {
                if(ServicePointManager.ServerCertificateValidationCallback ==null)
                {
                    ServicePointManager.ServerCertificateValidationCallback += 
                        delegate
                        (
                            Object obj, 
                            X509Certificate certificate, 
                            X509Chain chain, 
                            SslPolicyErrors errors
                        )
                        {
                            return true;
                        };
                }
            }
        }
    "@
        Add-Type $certCallback
     }
    [ServerCertificateValidationCallback]::Ignore()

Invoke-WebRequest -Uri https://apod.nasa.gov/apod/
Gowtham Balusamy
quelle
1
Diese Antwort deaktiviert effektiv die Sicherheitsüberprüfung. Während es den Fehler beseitigen kann, öffnet es die Angriffsfläche Ihres Geräts auf eine Weise, die viele für inakzeptabel halten würden. Ich würde dies niemals auf einem Gerät verwenden, das ich besitze.
Keine Rückerstattung Keine Rückgabe
1

Stellen Sie sicher, dass Sie zuerst die SHELL wechseln:

SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]

RUN [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 
RUN Invoke-WebRequest -UseBasicParsing -Uri  'https://github.com/git-for-windows/git/releases/download/v2.25.1.windows.1/Git-2.25.1-64-bit.exe' -OutFile 'outfile.exe'
Pixelbits
quelle
0

Ich habe den Grund nicht herausgefunden, aber die Neuinstallation des .pfxZertifikats (sowohl auf dem aktuellen Benutzer als auch auf dem lokalen Computer) funktioniert für mich.

Spencer
quelle
Welche .pfx haben Sie neu installiert?
Keine Rückerstattung Keine Rückgabe
@NoRefundsNoReturns Die Zertifikatdatei, mit der Sie die Anforderung senden möchten.
Spencer
Mir ist immer noch nicht klar, wie dies auf die Frage anwendbar ist.
Keine Rückerstattung Keine Rückgabe
@NoRefundsNoReturns Wenn ich Invoke-WebRequestlokal bin , funktioniert es zuerst, wird aber später fehlschlagen. Es scheint, dass es manchmal das Zertifikat nicht mehr lesen kann (ich kenne den Mechanismus dahinter nicht. Vielleicht ist es eine Einstellung, die von der Firma kontrolliert wird). In diesem Fall funktioniert die Neuinstallation des Zertifikats.
Spencer
Wenn Sie den privaten Schlüssel für ein Zertifikat verlieren, das das Zertifikat sicherlich unbrauchbar machen kann, aber ich bezweifle, dass dies hier das Problem ist. Wenn Sie den Schlüssel verlieren, müssen Sie sicherstellen, dass Sie den privaten Schlüssel speichern und als dauerhaft markieren. Stellen Sie eine neue Frage, wenn dies der Fall ist.
Keine Rückerstattung Keine Rückgabe