401 votes

Powershell Invoke-WebRequest échoue avec SSL/TLS Secure Channel

Je essaie d'exécuter cette commande powershell

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

et je obtiens cette erreur. "Invoke-WebRequest : The request was aborted: Could not create SSL/TLS secure channel." Les requêtes https semblent fonctionner ("https://google.com") mais pas celle-ci en question. Comment puis-je faire en sorte que cela fonctionne ou utiliser une autre commande powershell pour lire le contenu de la page?

2 votes

843voto

Chandan Rai Points 4279

Essayez d'utiliser celui-ci

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

67 votes

Par défaut, powershell utilise TLS 1.0, la sécurité du site nécessite TLS 1.2

3 votes

Awh, Comment avez-vous déterminé la version de TLS du site?

17 votes

Essayez SSLLabs pour déterminer les informations : Rapport SSL : apod.nasa.gov montre TLS1.1 et TLS1.2

231voto

Dans une tentative effrontée de voler quelques votes, SecurityProtocol est une Enum avec l'attribut [Flags]. Ainsi, vous pouvez faire ceci :

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

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

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

Alors vous n'avez pas vraiment besoin de connaître la version de TLS.

J'ai copié-collé cela 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 fonctionne. Bien sûr, vous pourriez le faire si vous le vouliez.

Note finale - J'ai la déclaration originale (moins les modifications SO) dans mon profil PowerShell donc elle est présente dans chaque session que je démarre maintenant. Ce n'est pas totalement infaillible puisqu'il y a encore certains sites qui échouent mais je vois certainement le message en question beaucoup moins fréquemment.

10 votes

Si vous avez besoin d'accéder à un site qui utilise SSLv3, alors vous voudrez [Net.ServicePointManager]::SecurityProtocol = "Tls12, Tls11, Tls, Ssl3". N'oubliez pas que SSLv3 et TLSv1.0 ont été obsolètes en raison de POODLE, donc utilisez à vos risques et périls.

1 votes

N'y a-t-il pas un moyen d'utiliser la réflexion pour permettre simplement tous les types Net.SecurityProtocolType ? il doit y avoir une solution

1 votes

Pourquoi voulez-vous autoriser par défaut l'accès à des protocoles connus comme étant défectueux ? Quoi qu'il en soit, je crois que la sortie imminente (à la date de rédaction de cet article) de PowerShell V7 traitera enfin ce problème une fois pour toutes et cette question disparaitra lentement dans l'oubli qu'elle mérite.

31voto

Sidrah Points 458

La cause de l'erreur est que Powershell utilise par défaut TLS 1.0 pour se connecter au site web, mais la sécurité du site nécessite TLS 1.2. Vous pouvez modifier ce comportement en exécutant l'une des commandes ci-dessous pour utiliser tous les protocoles. Vous pouvez également spécifier un seul protocole.

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls, [Net.SecurityProtocolType]::Tls11, [Net.SecurityProtocolType]::Tls12, [Net.SecurityProtocolType]::Ssl3
[Net.ServicePointManager]::SecurityProtocol = "Tls, Tls11, Tls12, Ssl3"

Après avoir exécuté ces commandes, essayez d'exécuter votre commande :

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

alors cela fonctionnera.

11voto

Celui-ci a fonctionné pour moi

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

8voto

Mark-DG1 Points 134

Si, comme moi, aucune des solutions ci-dessus ne fonctionne tout à fait, il pourrait également être utile d'essayer spécifiquement une version inférieure de TLS seule. J'avais essayé les deux solutions suivantes, mais cela n'avait pas semblé 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 (en retirant spécifiquement les versions 1.1 et 1.2 dans le code) que cela a fonctionné :

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

Le serveur local (sur lequel cela a été tenté) accepte TLS 1.2, bien que le serveur distant (qui avait été précédemment "confirmé" comme compatible avec TLS 1.2 par un tiers) semble ne pas l'être.

J'espère que cela aidera quelqu'un.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X