2017-01-12 23 views
40

Próbuję wykonać to polecenie PowerShellPowerShell Invoke-WebRequest katastrofy z SSL/TLS bezpiecznego kanału

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

i otrzymuję ten błąd. "Invoke-WebRequest: żądanie zostało przerwane: nie można utworzyć bezpiecznego kanału SSL/TLS." Żądania https działają ("https://google.com"), ale nie ten, o którym mowa. Jak mogę uruchomić tę funkcję lub użyć innej komendy powershell do odczytania zawartości strony?

Odpowiedz

93

wypróbować ten jeden

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 
Invoke-WebRequest -Uri https://apod.nasa.gov/apod/ 
+2

to działa! Czy możesz mi wyjaśnić, dlaczego? – hewstone

+5

Domyślnie powershell używa TLS 1.0, a bezpieczeństwo strony wymaga TLS 1.2 – crowchirp

+1

Awh, Jak ustaliłeś wersję strony TLS? – hewstone

21

W bezwstydna próba kradzieży kilka głosów, SecurityProtocol jest Enum z atrybutem [Flags]. Więc można to zrobić:

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

A ponieważ jest PowerShell, można pozwolić mu analizować ciąg dla Ciebie:

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

Wtedy nie technicznie trzeba znać wersję TLS.

Skopiowałem i wkleiłem to ze scenariusza, który stworzyłem po przeczytaniu tej odpowiedzi, ponieważ nie chciałem przechodzić przez wszystkie dostępne protokoły, aby znaleźć taki, który działał. Oczywiście, możesz może zrobić to, jeśli chcesz.

+0

Jeśli potrzebujesz dostępu do witryny korzystającej z SSLv3, będziesz potrzebować '[Net.ServicePointManager] :: SecurityProtocol =" Tls12, Tls11, Tls, Ssl3 "'. Pamiętaj, że SSLv3 i TLSv1.0 są przestarzałe z powodu POODLE, więc używaj na własne ryzyko. – jordanbtucker