Вызывается SSL-вызов Invoke-WebRequest?

Когда я пытаюсь использовать Invoke-WebRequest, я получаю какую-то странную ошибку:

Invoke-WebRequest -Uri "https://idp.safenames.com/"

Invoke-WebRequest : The underlying connection was closed: An unexpected error occurred on a send.

Я не уверен, что вызывает его, поскольку сам сайт кажется прекрасным.

Даже при всех ошибках "ignore ssl errors" вокруг stackoverflow он все равно не работает, что заставляет меня задаться вопросом, связано ли это с SSL вообще.

Ответ 1

Как Примечания BaconBits, версия .NET > 4.5 использует SSLv3 и TLS 1.0 по умолчанию.

Вы можете изменить это поведение, установив SecurityProtocol с помощью класса ServicePointManager:

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 (поэтому это относится только к текущему экземпляру хост-приложения)

Ответ 2

На основе это сканирование, это не похоже на то, что URI поддерживает все, что ниже TLS 1.1.

В какой версии Windows вы работаете? Если вы используете PowerShell v4.0 или ниже, вы не сможете согласовать соединение TLS 1.1 или 1.2, потому что .Net Framework не поддерживает TLS 1.1 или 1.2 до .NET Framework 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. Я также получаю сообщение об ошибке, если я использую wget для Windows 1.11.4 из здесь (OpenSSL 0.9.8b, задолго до TLS 1.1 и 1.2), но он отлично работает, если я использую wget для Windows 1.17.1 из здесь (текущий, более или менее).

Ответ 3

Это также может быть постоянно изменено

# set strong cryptography on 32 bit .Net Framework (version 4 and above)
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord
# set strong cryptography on 64 bit .Net Framework (version 4 and above)
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord