Powershell Invoke-WebRequest non è riuscito con il canale sicuro SSL / TLS


254

Sto cercando di eseguire questo comando PowerShell

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

e ottengo questo errore. "Invoke-WebRequest: la richiesta è stata interrotta: impossibile creare il canale sicuro SSL / TLS." Le richieste https sembrano funzionare (" https://google.com ") ma non questa in questione. Come posso farlo funzionare o usare altri comandi PowerShell per leggere il contenuto della pagina?


Risposte:


537

prova a usare questo

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

48
Per impostazione predefinita, PowerShell utilizza TLS 1.0, la sicurezza del sito richiede TLS 1.2
Chandan Rai,

3
Awh, Come hai determinato la versione TLS del sito?
Hewstone,

16
Prova SSLLabs per determinare le informazioni: Rapporto SSL: apod.nasa.gov mostra TLS1.1 e TLS1.2
Christopher G. Lewis

1
C'è un modo per farlo che è un po 'più permanente? Funziona ma sembra ripristinarsi con ogni finestra della console.
Brandon,

3
@Brandon Modificalo $env:Profileo, meglio ancora, modifica la tabella di registro .
Franklin Yu,

166

In un tentativo spudorato di rubare alcuni voti, SecurityProtocolè un Enumcon l' [Flags]attributo. Quindi puoi farlo:

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

O poiché si tratta di PowerShell, puoi lasciargli analizzare una stringa per te:

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

Quindi tecnicamente non è necessario conoscere la versione TLS.

Ho copiato e incollato questo da uno script creato dopo aver letto questa risposta perché non volevo scorrere tutti i protocolli disponibili per trovarne uno che funzionasse. Naturalmente, si potrebbe fare che se si voleva.

Nota finale: ho l'istruzione originale (meno le modifiche SO) nel mio profilo PowerShell, quindi è in ogni sessione che inizio ora. Non è completamente infallibile poiché ci sono ancora alcuni siti che falliscono, ma sicuramente vedo il messaggio in questione molto meno frequentemente.


7
Se devi accedere a un sito che utilizza SSLv3, ti consigliamo [Net.ServicePointManager]::SecurityProtocol = "Tls12, Tls11, Tls, Ssl3". Ricorda che SSLv3 e TLSv1.0 sono stati deprecati a causa di POODLE, quindi utilizzali a tuo rischio.
jordanbtucker,

non c'è modo di usare la riflessione per consentire solo tutti i tipi Net.SecurityProtocolType? ci deve essere
red888

Perché si desidera consentire l'accesso ai protocolli con difetti noti per impostazione predefinita? Indipendentemente da ciò, credo che la versione imminente di PowerShell V7 (al momento in cui scrivo) affronterà questo problema una volta per tutte e questa domanda svanirà lentamente nel suo giusto e ben meritato oblio.
Nessun rimborso Nessun reso

2

Se, come me, nessuna delle precedenti funzioni funziona, potrebbe valere la pena provare anche una versione TLS inferiore da sola. Avevo provato entrambi i seguenti, ma non sembrava risolvere il mio problema:

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

Alla fine, è stato solo quando ho preso di mira TLS 1.0 (in particolare rimuovere 1.1 e 1.2 nel codice) che ha funzionato:

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

Il server locale (su cui si stava tentando) va bene con TLS 1.2, anche se il server remoto (che è stato precedentemente "confermato" come bene per TLS 1.2 da una terza parte) sembra non esserlo.

Spero che questo aiuti qualcuno.


1

Per me funziona...

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
Questa risposta disabilita efficacemente il controllo di sicurezza. Sebbene possa eliminare l'errore, apre la superficie di attacco del dispositivo in modi che molti considererebbero inaccettabili. Non lo userei mai su un dispositivo che possiedo.
Nessun rimborso Nessun

1

Assicurati di cambiare prima lo 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'

0

Non ho capito il motivo, ma reinstallare il .pfxcertificato (sia nell'utente corrente che nella macchina locale) funziona per me.


quale .pfx hai reinstallato?
Nessun rimborso Nessun

@NoRefundsNoReturns Il file del certificato che si desidera utilizzare per inviare la richiesta.
Spencer,

Non sono ancora chiaro come questo sia applicabile alla domanda.
Nessun rimborso Nessun

@NoRefundsNoReturns Quando Invoke-WebRequestlocalmente, funziona inizialmente ma fallirà in seguito. Sembra che a volte non riesca più a leggere il certificato (non conosco il meccanismo dietro di esso. Forse è un'impostazione controllata dall'azienda). Ma reinstallare il certificato funziona in questo caso.
Spencer,

Se stai perdendo la chiave privata per un certificato che può certamente rendere la certificazione inutilizzabile, ma dubito che questo sia il problema qui. Se stai perdendo la chiave, devi assicurarti di salvare la chiave privata e di contrassegnarla come persistente. Fai una nuova domanda se questo è ciò che sta accadendo.
Nessun rimborso Nessun
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.