当我尝试使用Invoke-WebRequest
时,我遇到了一些奇怪的错误:
Invoke-WebRequest -Uri "https://idp.safenames.com/"
Invoke-WebRequest : The underlying connection was closed: An unexpected error occurred on a send.
我不确定是什么导致它,因为网站本身似乎很好。
即使堆栈溢出周围的所有“忽略ssl错误”函数,它仍然无法正常工作,让我想知道它是否与SSL有关。
答案 0 :(得分:50)
作为BaconBits notes,.NET版本> 4.5默认情况下使用SSLv3和TLS 1.0。
您可以通过使用ServicePointManager
类设置SecurityProtocol
政策来更改此行为:
PS C:\> $AllProtocols = [System.Net.SecurityProtocolType]'Ssl3,Tls,Tls11,Tls12'
PS C:\> [System.Net.ServicePointManager]::SecurityProtocol = $AllProtocols
PS C:\> (Invoke-WebRequest -Uri "https://idp.safenames.com/").StatusCode
200
这将适用于AppDomain中的所有请求(因此它仅适用于主机应用程序的当前实例)。
a module on GitHub现在可以在PSGallery中管理这些设置:
Install-Module BetterTls -Scope CurrentUser
Import-Module BetterTls
Enable-Tls -Tls11 -Tls12
答案 1 :(得分:9)
基于this scan,看起来URI并不支持低于TLS 1.1的任何内容。
您使用的是哪个版本的Windows?如果您使用的是PowerShell v4.0或更低版本,那么您将无法协商TLS 1.1或1.2连接,因为.Net Framework不支持TLS 1.1或1.2直到.Net框架4.5。 PowerShell v4.0是.Net 4.0。这意味着底层的System.Net.WebRequest类无法协商连接。我相信PowerShell v5.0是.Net 4.5或.Net 4.6,但我现在没有Win 10客户端来检查$PSVersionTable
。
您可以通过手动编写对WebRequest的调用并将协议指定为[System.Net.SecurityProtocolType]::Tls12
或[System.Net.SecurityProtocolType]::Tls11
来使其工作,但我不确定是否这样做可能。如果.Net 4.5是根据我所看到的安装的,那应该可行。但是,我再也没有尝试过。
作为参考,我在Windows 7 x64 / Powershell v4.0上得到与您完全相同的结果,并且我安装了.Net 4.5,但我从未尝试手动编写WebRequest编码。如果我从here(OpenSSL 0.9.8b,早在TLS 1.1和1.2之前)使用wget for Windows 1.11.4,我也会收到错误,但如果我使用wget for Windows 1.17.1从{{ {3}}(当前,或多或少)。
答案 2 :(得分:7)
这也可以永久改变
import copy
class Shape():
def __init__(self, center):
self.center = center
def translate(self, new_center):
new_shape = copy.copy(self) # Replace with deepcopy if needed
new_shape.center = new_center
...
答案 3 :(得分:1)
一行:
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12