Powershell Invoke-WebRequest nie działa z bezpiecznym kanałem SSL / TLS

253

Próbuję wykonać to polecenie programu PowerShell

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

i pojawia się ten błąd. „Invoke-WebRequest: Żądanie zostało przerwane: nie można utworzyć bezpiecznego kanału SSL / TLS.” Żądania https wydają się działać („ https://google.com ”), ale nie dotyczy to tego pytania. Jak mogę to uruchomić lub użyć innej komendy PowerShell do odczytania zawartości strony?

hewstone
źródło
2
Zobacz także Default SecurityProtocol w .NET 4.5 .
Franklin Yu,

Odpowiedzi:

535

spróbuj użyć tego

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Invoke-WebRequest -Uri https://apod.nasa.gov/apod/
Chandan Rai
źródło
48
Domyślnie PowerShell używa TLS 1.0, bezpieczeństwo strony wymaga TLS 1.2
Chandan Rai
3
Och, jak ustaliłeś wersję witryny TLS?
hewstone 12.01.17
16
Wypróbuj SSLLabs, aby określić informacje: Raport SSL: apod.nasa.gov pokazuje TLS1.1 i TLS1.2
Christopher G. Lewis
1
Czy istnieje sposób na zrobienie tego, który jest trochę bardziej trwały? Działa to, ale wydaje się, że resetuje się przy każdym oknie konsoli.
Brandon,
3
@Brandon Zmień $env:Profile, lub jeszcze lepiej, edytuj tabelę rejestru .
Franklin Yu,
166

W bezwstydnej próbie kradzieży niektórych głosów, SecurityProtocoljest Enumz [Flags]atrybutem. Możesz to zrobić:

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

Lub ponieważ jest to PowerShell, możesz pozwolić mu przeanalizować ciąg znaków:

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

Zatem technicznie nie musisz znać wersji TLS.

Skopiowałem i wkleiłem to ze skryptu, który utworzyłem po przeczytaniu tej odpowiedzi, ponieważ nie chciałem przeglądać wszystkich dostępnych protokołów, aby znaleźć taki, który zadziałał. Oczywiście możesz to zrobić, jeśli chcesz.

Ostatnia uwaga - w moim profilu PowerShell mam oryginalną instrukcję (bez edycji SO), więc jest to każda sesja, którą zaczynam teraz. Nie jest to całkowicie niezawodne, ponieważ nadal istnieją niektóre witryny, które po prostu zawodzą, ale z pewnością znacznie rzadziej widzę tę wiadomość.

Bez zwrotów Bez zwrotów
źródło
7
Jeśli chcesz uzyskać dostęp do witryny korzystającej z protokołu SSLv3, będziesz tego potrzebować [Net.ServicePointManager]::SecurityProtocol = "Tls12, Tls11, Tls, Ssl3". Pamiętaj, że SSLv3 i TLSv1.0 zostały wycofane ze względu na POODLE, więc używaj na własne ryzyko.
jordanbtucker
czy nie istnieje sposób użycia refleksji, aby zezwolić na wszystkie typy Net.SecurityProtocolType? musi być
czerwony888
Dlaczego chcesz domyślnie zezwalać na dostęp do znanych protokołów? Niezależnie od tego uważam, że zbliżająca się (od chwili pisania) wersja PowerShell V7 raz na zawsze rozwiąże ten problem, a pytanie to powoli zmieni się w słuszne i zasłużone zapomnienie.
Bez zwrotów Bez zwrotów
2

Jeśli, podobnie jak ja, żadna z powyższych nie działa całkiem dobrze, warto również spróbować wypróbować samą niższą wersję TLS. Próbowałem obu poniższych rozwiązań, ale nie udało mi się rozwiązać mojego problemu:

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

Ostatecznie zadziałało tylko wtedy, gdy celowałem w TLS 1.0 (konkretnie usuwając 1.1 i 1.2 w kodzie):

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

Serwer lokalny (na którym próbowano to zrobić) jest w porządku z TLS 1.2, chociaż zdalny serwer (wcześniej „potwierdzony” jako w porządku dla TLS 1.2 przez firmę zewnętrzną) wydaje się nie działać.

Mam nadzieję, że to komuś pomoże.

Mark-DG1
źródło
1

Mi to pasuje...

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
źródło
1
Ta odpowiedź skutecznie wyłącza sprawdzanie bezpieczeństwa. Chociaż może wyeliminować błąd, otwiera powierzchnię ataku urządzenia w sposób, który wielu uważa za niedopuszczalne. Nigdy nie użyłbym tego na urządzeniu, które posiadam.
Bez zwrotów Bez zwrotów
1

Pamiętaj, aby najpierw przełączyć SHELL:

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'
piksele
źródło
0

Nie znalazłem powodu, ale ponowna instalacja .pfxcertyfikatu (zarówno w bieżącym użytkowniku, jak i komputerze lokalnym) działa dla mnie.

Spencer
źródło
który .pfx ponownie zainstalowałeś?
Bez zwrotów Bez zwrotów
@NoRefundsNoReturns Plik certyfikatu, którego chcesz użyć do wysłania żądania.
Spencer
Nadal nie jestem pewien, jak to się ma do pytania.
Bez zwrotów Bez zwrotów
@NoRefundsNoReturns Kiedy Invoke-WebRequestlokalnie działam na początku, ale później się nie powiedzie. Wygląda na to, że czasami nie może już odczytać certyfikatu (nie znam mechanizmu stojącego za tym. Może to ustawienie kontrolowane przez firmę). Ale ponowna instalacja certyfikatu działa w tym przypadku.
Spencer
Jeśli tracisz klucz prywatny dla certyfikatu, który z pewnością może sprawić, że certyfikat będzie bezużyteczny, ale wątpię, że to jest problem. Jeśli tracisz klucz, musisz upewnić się, że zapisałeś klucz prywatny i oznaczyłeś go jako trwały. Zadaj nowe pytanie, czy tak się dzieje.
Bez zwrotów Bez zwrotów