我正在尝试执行这个 powershell 命令
Invoke-WebRequest -Uri https://apod.nasa.gov/apod/
我得到这个错误。 “Invoke-WebRequest:请求被中止:无法创建 SSL/TLS 安全通道。” https 请求似乎有效(“https://google.com”)但不是这个有问题的请求。我怎样才能让它工作或使用其他 powershell 命令来读取页面内容?
尝试使用这个
[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 编辑)语句,所以它出现在我现在开始的每个会话中。这不是完全万无一失的,因为仍然有一些网站失败了,但我肯定很少看到有问题的消息。
[Net.ServicePointManager]::SecurityProtocol = "Tls12, Tls11, Tls, Ssl3"
。请记住,由于 POODLE,SSLv3 和 TLSv1.0 已被弃用,因此使用风险自负。
错误原因是 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/
那么它将起作用。
如果像我一样,上述方法都不起作用,那么单独尝试较低的 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 上很好,尽管远程服务器(之前被第 3 方“确认”对 TLS 1.2 很好)似乎不是。
希望这可以帮助某人。
这个对我有用...
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/
确保先切换 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'
windows-2019
代理)上构建 Docker 映像时没有进行此修复
我还没有弄清楚原因,但重新安装 .pfx
证书(在当前用户和本地计算机中)对我有用。
Invoke-WebRequest
时,它起初可以工作,但稍后会失败。似乎有时它无法再读取证书(我不知道它背后的机制。也许这是公司控制的设置)。但是在这种情况下重新安装证书有效。
$env:Profile
中更改它,或者更好的是 edit registry table。