it-swarm.com.de

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

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-Sicherheitskanal konnte nicht erstellt werden." https-Anforderungen scheinen zu funktionieren (" https : //google.com ") aber nicht dieses fragliche. Wie kann ich das zum Laufen bringen oder einen anderen Powershell-Befehl verwenden, um den Seiteninhalt zu lesen?

204
hewstone

versuchen Sie es mit diesem

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Invoke-WebRequest -Uri https://apod.nasa.gov/apod/
408
Chandan Rai

In einem schamlosen Versuch, einige Stimmen zu stehlen, ist SecurityProtocol ein Enum mit dem [Flags] Attribut. So können Sie dies tun:

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

Oder da dies PowerShell ist, können Sie eine Zeichenfolge für Sie analysieren lassen:

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

Dann brauchen Sie die TLS-Version technisch nicht zu kennen.

Ich habe dies aus einem Skript kopiert und eingefügt, das ich nach dem Lesen dieser Antwort erstellt habe, weil ich nicht alle verfügbaren Protokolle durchlaufen wollte, um ein funktionierendes zu finden. Natürlich könnten Sie das tun, wenn Sie wollten.

Letzte Anmerkung - Ich habe die ursprüngliche Anweisung (minus SO Änderungen) in meinem PowerShell-Profil, sodass sie in jeder Sitzung vorhanden ist, die ich jetzt starte. Es ist nicht absolut narrensicher, da es immer noch einige Websites gibt, die einfach nicht funktionieren, aber ich sehe die betreffende Nachricht mit Sicherheit viel seltener.

142

Dieser hat für mich gearbeitet

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

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/
1

Wenn, wie ich, keines der oben genannten Verfahren funktioniert, lohnt es sich möglicherweise, auch nur eine niedrigere TLS-Version zu testen. Ich hatte beide der folgenden Methoden 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

Letztendlich hat es nur funktioniert, als ich TLS 1.0 als Ziel ausgewählt habe (insbesondere 1.1 und 1.2 im Code entfernen):

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

Der lokale Server (auf dem dies versucht wurde) ist in Ordnung mit TLS 1.2, 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.

1
Mark-DG1

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

0
Spencer