web-dev-qa-db-fra.com

Powershell Invoke-WebRequest échoue avec le canal sécurisé SSL / TLS

J'essaie d'exécuter cette commande Powershell

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

et je reçois cette erreur. "Invoke-WebRequest: la demande a été abandonnée: impossible de créer le canal sécurisé SSL/TLS." Les demandes https semblent fonctionner (" https : //google.com ") mais pas celui-ci en question. Comment puis-je le faire fonctionner ou utiliser une autre commande powershell pour lire le contenu de la page?

186
hewstone

essayez d'utiliser celui-ci

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

Dans une tentative éhontée de voler des votes, SecurityProtocol est un Enum avec l'attribut [Flags]. Donc, vous pouvez faire ceci:

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

Ou, puisqu'il s'agit de PowerShell, vous pouvez le laisser analyser une chaîne pour vous:

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

Dans ce cas, vous n'avez techniquement pas besoin de connaître la version de TLS.

Je l'ai copié et collé à partir d'un script que j'ai créé après avoir lu cette réponse, car je ne voulais pas parcourir tous les protocoles disponibles pour en trouver un qui fonctionnait. Bien sûr, vous pourriez le faire si vous le vouliez.

Note finale - J'ai l'énoncé original (moins SO édités) dans mon profil PowerShell, il est donc présent dans toutes les sessions que je démarre maintenant. Ce n'est pas totalement infaillible puisqu'il y a encore des sites qui échouent mais je vois sûrement le message en question beaucoup moins fréquemment.

133

Celui-ci a fonctionné pour moi

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

Ça marche pour moi...

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
Gowtham Balusamy

Si, comme moi, rien de ce qui précède ne fonctionne, il pourrait être intéressant d'essayer spécifiquement une version inférieure de TLS. J'avais essayé les deux choses suivantes, mais ne semblais pas résoudre mon problème:

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

En fin de compte, ce n'est que lorsque j'ai ciblé TLS 1.0 (supprimer spécifiquement 1.1 et 1.2 dans le code) qu'il a fonctionné:

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

Le serveur local (sur lequel cela a été tenté) convient à TLS 1.2, bien que le serveur distant (qui était auparavant "confirmé" par Tiers 1.2 par une tierce partie) ne le soit pas.

J'espère que ça aide quelqu'un.

1
Mark-DG1

Je n'ai pas trouvé la raison, mais la réinstallation du certificat .pfx (à la fois dans l'utilisateur actuel et sur l'ordinateur local) fonctionne pour moi.

0
Spencer