使用SSL/TLS安全通道时Powershell Invoke-WebRequest失败

我正在尝试执行这个powershell命令

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

得到这个错误。"请求被中止:无法创建SSL/TLS安全通道。" https请求似乎工作(“https://google.com”),但不是这个问题。我怎么能让这个工作或使用其他powershell命令读取页面内容?

317459 次浏览

试试这个

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

为了无耻地窃取选票,SecurityProtocol是一个带有[Flags]属性的Enum。所以你可以这样做:

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

或者因为这是PowerShell,你可以让它为你解析字符串:

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

从技术上讲,您不需要知道TLS版本。

我从我在阅读这个答案后创建的脚本中复制并粘贴了它,因为我不想循环遍历所有可用的协议来找到一个有效的协议。当然,你可以做,如果你想。

最后提醒-我在PowerShell配置文件中有原始(减去SO编辑)语句,所以它在我现在开始的每个会话中。这并不是完全万无一失的,因为仍然有一些网站失败了,但我肯定看到有问题的信息的频率要低得多。

这对我很有用……

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/

我还没有弄清楚原因,但重新安装.pfx证书(在当前用户和本地机器中)对我有效。

如果像我一样,上述任何一种方法都不能很好地工作,那么也值得专门单独尝试较低的TLS版本。我试过以下两种方法,但似乎都没能解决我的问题:

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

最后,只有当我针对TLS 1.0(特别是在代码中删除1.1和1.2)时,它才起作用:

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

本地服务器(正在进行尝试)对TLS 1.2没有问题,尽管远程服务器(之前已被第三方“确认”为对TLS 1.2没有问题)似乎没有问题。

希望这能帮助到一些人。

确保你先切换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'

此错误的原因是Powershell默认使用TLS 1.0连接网站,但网站安全需要TLS 1.2。您可以通过运行以下任何命令来改变这种行为,以使用所有协议。您也可以指定单个协议。

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

运行这些命令后,尝试运行您的命令:

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

那么它就会起作用。