PowerShell 调用 WebRequest 抛出 WebCmdletResponseException
PowerShell Invoke-WebRequest throws WebCmdletResponseException
执行行 Invoke-WebRequest -Uri https://www.freehaven.net/anonbib/date.html
时,PowerShell 抛出 WebCmdletResponseException
。我怎样才能获得有关它的更多信息,这可能是什么原因造成的?虽然我可以使用 Python 成功获取页面内容,但在 PowerShell 中它会引发异常。
完全异常:
Invoke-WebRequest : The underlying connection was closed: An unexpected error occurred on a send.
At line:1 char:1
+ Invoke-WebRequest -Uri https://www.freehaven.net/anonbib/date.html
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebExc
eption
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
这是因为 Invoke-WebRequest
在幕后使用了 HttpWebRequest
,除了最新版本的 .Net 之外,其他所有版本都默认使用 SSLv3 和 TLSv1。
查看当前值就可以看出这一点:
[System.Net.ServicePointManager]::SecurityProtocol
site you're connecting to only supports TLS 1.2.
您可以更改允许的协议,但它会在您的应用程序 运行:
期间全局应用
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12
这会覆盖值。
当然,这会破坏应用程序中依赖于与不支持 TLS 1.2 的服务器的连接的任何其他内容
一个安全的方法可能是添加 TLS 1.2:
[System.Net.ServicePointManager]::SecurityProtocol] = (
[System.Net.ServicePointManager]::SecurityProtocol -bor
[System.Net.SecurityProtocolType]::Tls12
)
# parentheses are for readability
万一这仍然会导致其他网站出现问题(不确定是什么,也许某个网站说它接受 TLS 1.2 但它的实现被破坏了,而它的 TLS 1.0 工作正常?),你可以保存以前的值并恢复它。
$cur = [System.Net.ServicePointManager]::SecurityProtocol]
try {
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12
Invoke-WebRequest -Uri https://www.freehaven.net/anonbib/date.html
} finally {
[System.Net.ServicePointManager]::SecurityProtocol = $cur
}
执行行 Invoke-WebRequest -Uri https://www.freehaven.net/anonbib/date.html
时,PowerShell 抛出 WebCmdletResponseException
。我怎样才能获得有关它的更多信息,这可能是什么原因造成的?虽然我可以使用 Python 成功获取页面内容,但在 PowerShell 中它会引发异常。
完全异常:
Invoke-WebRequest : The underlying connection was closed: An unexpected error occurred on a send. At line:1 char:1 + Invoke-WebRequest -Uri https://www.freehaven.net/anonbib/date.html + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebExc eption + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
这是因为 Invoke-WebRequest
在幕后使用了 HttpWebRequest
,除了最新版本的 .Net 之外,其他所有版本都默认使用 SSLv3 和 TLSv1。
查看当前值就可以看出这一点:
[System.Net.ServicePointManager]::SecurityProtocol
site you're connecting to only supports TLS 1.2.
您可以更改允许的协议,但它会在您的应用程序 运行:
期间全局应用[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12
这会覆盖值。
当然,这会破坏应用程序中依赖于与不支持 TLS 1.2 的服务器的连接的任何其他内容
一个安全的方法可能是添加 TLS 1.2:
[System.Net.ServicePointManager]::SecurityProtocol] = (
[System.Net.ServicePointManager]::SecurityProtocol -bor
[System.Net.SecurityProtocolType]::Tls12
)
# parentheses are for readability
万一这仍然会导致其他网站出现问题(不确定是什么,也许某个网站说它接受 TLS 1.2 但它的实现被破坏了,而它的 TLS 1.0 工作正常?),你可以保存以前的值并恢复它。
$cur = [System.Net.ServicePointManager]::SecurityProtocol]
try {
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12
Invoke-WebRequest -Uri https://www.freehaven.net/anonbib/date.html
} finally {
[System.Net.ServicePointManager]::SecurityProtocol = $cur
}