2016-03-28 21 views
11

Quando provo ad usare Invoke-WebRequest Sto ottenendo un errore strano:Invoke-WebRequest SSL non riesce?

Invoke-WebRequest -Uri "https://idp.safenames.com/" 

Invoke-WebRequest : The underlying connection was closed: An unexpected error occurred on a send. 

Non sono sicuro di quale è la causa, come il sito stesso sembra che vada bene.

Anche con tutte le funzioni di "ignora errori ssl" attorno a StackOverflow, non funziona ancora, mi chiedo se sia collegato a SSL.

+0

provare a impostare il vostro agente utente a un normale browser con par '-UserAgent' ameter. Forse il sito sta bloccando le connessioni da "bot". – briantist

+0

@briantist Ci ho pensato, ma no, anche con useragent corretto questo non funziona. – iTayb

risposta

20

Come BaconBits notes, versione .NET> 4.5 utilizza SSLv3 e TLS 1.0 per impostazione predefinita.

È possibile modificare questo comportamento impostando la politica SecurityProtocol con la classe ServicePointManager:

PS C:\> $AllProtocols = [System.Net.SecurityProtocolType]'Ssl3,Tls,Tls11,Tls12' 
PS C:\> [System.Net.ServicePointManager]::SecurityProtocol = $AllProtocols 
PS C:\> (Invoke-WebRequest -Uri "https://idp.safenames.com/").StatusCode 
200 

Ciò si applicherà a tutte le richieste del AppDomain (in modo che vale solo per l'istanza corrente dell'applicazione host)

+0

Cosa sto sbagliando? Non posso seriamente dire ... http://imgur.com/FgHqF1o –

+0

Powershell 4.0 o 4 0 -1 -1 quando si utilizza la query psversiontable.psversion –

+0

Repro di comportamento su 2 finestre di windows diff, win8.1 e 10 –

5

In base a this scan, non sembra che l'URI supporti qualcosa di inferiore a TLS 1.1.

Quale versione di Windows è attiva? Se si utilizza PowerShell v4.0 o versioni precedenti, non sarà possibile negoziare una connessione TLS 1.1 o 1.2 poiché .Net Framework non supporta TLS 1.1 o 1.2 fino a .Net Framework 4.5. PowerShell v4.0 è .Net 4.0. Ciò significa che le sottostanti classi System.Net.WebRequest non possono negoziare una connessione. Credo che PowerShell v5.0 sia .Net 4.5 o .Net 4.6, ma non ho un client Win 10 per controllare il $PSVersionTable in questo momento.

Potrebbe essere possibile farlo funzionare codificando le chiamate su WebRequest manualmente e specificando il protocollo come [System.Net.SecurityProtocolType]::Tls12 o [System.Net.SecurityProtocolType]::Tls11, ma non sono sicuro che sia possibile. Dovrebbe funzionare se .Net 4.5 è installato da quello che sto vedendo, ma, ancora una volta, non l'ho mai provato.

Per riferimento, ottengo gli stessi risultati di Windows 7 x64/Powershell v4.0 e ho installato .Net 4.5, ma non ho mai provato a codificare manualmente WebRequest. Ho anche un errore se uso wget per Windows 1.11.4 da here (OpenSSL 0.9.8b, molto prima di TLS 1.1 e 1.2), ma funziona bene se utilizzo wget per Windows 1.17.1 da here (corrente, altro o meno).

+0

Utile, ma .... La domanda originale diceva "Non sono sicuro di cosa lo causa" Insegna a una persona a pescare .... Come sappiamo * che si tratta di un problema TLS? Ho avuto questa situazione e non ho potuto, per la vita di me, ricavare qualcosa dalla WebException che diceva "errore durante la negoziazione TLS". Peggio ancora, il problema è apparso solo durante test automatici, non test manuali. Come, dal lato client, posso ottenere un messaggio che dice "il client ha provato a negoziare con TLS 1.0 e il server l'ha rifiutato". O QUALCUNO tipo di spiegazione pseudo-inglese per l'errore, oltre "Si è verificato un errore imprevisto in una trasmissione". – Cheeso

+0

@Cheeso Spesso non si ottiene un errore utile perché il server non restituisce un errore al client. Termina semplicemente la connessione. Tutto il client sa che la connessione è terminata o è stata rifiutata. Avresti bisogno di guardare la comunicazione con Wireshark, che non è divertente con TLS. –

2

questo può essere cambiato in modo permanente, nonché

# set strong cryptography on 32 bit .Net Framework (version 4 and above) 
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord 
# set strong cryptography on 64 bit .Net Framework (version 4 and above) 
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord