我试图执行此powershell命令
Invoke-WebRequest -Uri https://apod.nasa.gov/apod/
我收到此错误。 " Invoke-WebRequest:请求已中止:无法创建SSL / TLS安全通道。" https请求似乎有效(" https://google.com&# 34;)但不是这个问题。如何让它工作或使用其他powershell命令来读取页面内容?
答案 0 :(得分:375)
尝试使用这个
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Invoke-WebRequest -Uri https://apod.nasa.gov/apod/
答案 1 :(得分:130)
在无耻地试图窃取某些选票时,SecurityProtocol
是具有Enum
属性的[Flags]
。所以你可以这样做:
[Net.ServicePointManager]::SecurityProtocol =
[Net.SecurityProtocolType]::Tls12 -bor `
[Net.SecurityProtocolType]::Tls11 -bor `
[Net.SecurityProtocolType]::Tls
或者因为这是PowerShell,你可以让它为你解析一个字符串:
[Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls"
然后,您在技术上不需要了解TLS版本。
我从阅读此答案后创建的脚本中复制并粘贴了这个,因为我不想遍历所有可用的协议来找到有效的协议。当然,如果你愿意,可以这样做。
最后的注释 - 我的PowerShell配置文件中有原始(减去SO编辑)语句,所以我现在开始的每个会话中都有。它并非完全万无一失,因为仍有一些网站失败但我肯定会更频繁地看到相关信息。
答案 2 :(得分:4)
这个为我工作
[Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls"
答案 3 :(得分:1)
它对我有用...
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/
答案 4 :(得分:1)
如果像我一样,上述方法均无效,那么单独尝试使用较低的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很好)似乎没有。
希望这对某人有帮助。
答案 5 :(得分:0)
我没有找出原因,但是重新安装.pfx
证书(在当前用户和本地计算机中)对我来说都是可行的。
答案 6 :(得分:0)
确保先切换外壳:
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'
答案 7 :(得分: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/
然后它会起作用。