Powershell Invoke-WebRequest falla con el canal seguro SSL/TLS
Estoy intentando ejecutar este comando de PowerShell
Invoke-WebRequest -Uri https://apod.nasa.gov/apod/
y me sale este error. "Invoke-WebRequest: la solicitud fue cancelada: no se pudo crear un canal seguro SSL/TLS". Las solicitudes https parecen funcionar (" https://google.com "), pero no esta en cuestión. ¿Cómo puedo hacer que esto funcione o usar otro comando de PowerShell para leer el contenido de la página?
intenta usar este
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Invoke-WebRequest -Uri https://apod.nasa.gov/apod/
En un descarado intento de robar algunos votos, SecurityProtocol
se encuentra Enum
con el [Flags]
atributo. Entonces puedes hacer esto:
[Net.ServicePointManager]::SecurityProtocol =
[Net.SecurityProtocolType]::Tls12 -bor `
[Net.SecurityProtocolType]::Tls11 -bor `
[Net.SecurityProtocolType]::Tls
O como se trata de PowerShell, puedes dejar que analice una cadena por ti:
[Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls"
Entonces técnicamente no necesitas conocer la versión de TLS.
Copié y pegué esto de un script que creé después de leer esta respuesta porque no quería recorrer todos los protocolos disponibles para encontrar uno que funcionara. Por supuesto, podrías hacerlo si quisieras.
Nota final: tengo la declaración original (menos las ediciones SO) en mi perfil de PowerShell, por lo que está en cada sesión que comienzo ahora. No es totalmente infalible ya que todavía hay algunos sitios que simplemente fallan, pero seguramente veo el mensaje en cuestión con mucha menos frecuencia.
La causa del error es que Powershell utiliza TLS 1.0 de forma predeterminada para conectarse al sitio web, pero la seguridad del sitio web requiere TLS 1.2. Puede cambiar este comportamiento ejecutando cualquiera de los siguientes comandos para utilizar todos los protocolos. También puede especificar un protocolo único.
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls, [Net.SecurityProtocolType]::Tls11, [Net.SecurityProtocolType]::Tls12, [Net.SecurityProtocolType]::Ssl3
[Net.ServicePointManager]::SecurityProtocol = "Tls, Tls11, Tls12, Ssl3"
Después de ejecutar estos comandos, intente ejecutar su comando:
Invoke-WebRequest -Uri https://apod.nasa.gov/apod/
entonces funcionará.
Si, como yo, nada de lo anterior funciona, podría valer la pena probar específicamente una versión TLS inferior. Intenté las dos cosas siguientes, pero no pareció resolver mi problema:
[Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls"
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 -bor [Net.SecurityProtocolType]::Tls11 -bor [Net.SecurityProtocolType]::Tls
Al final, fue solo cuando apunté a TLS 1.0 (específicamente eliminé 1.1 y 1.2 en el código) que funcionó:
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls
El servidor local (en el que se estaba intentando esto) está bien con TLS 1.2, aunque el servidor remoto (que previamente fue "confirmado" como correcto para TLS 1.2 por un tercero) parece no estarlo.
Espero que esto ayude a alguien.