Вызывается 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 вообще.

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

Вы можете изменить это поведение, установив политику SecurityProtocol с classом 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 (так что это относится только к текущему экземпляру хост-приложения).


В GitHub и в PSGallery есть модуль, который теперь может управлять этими настройками:

 Install-Module BetterTls -Scope CurrentUser Import-Module BetterTls Enable-Tls -Tls11 -Tls12 

На основе этого сканирования не похоже, что 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. Это означает, что базовые classы 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 отсюда (текущий, более или менее).

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

 # 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 
  • Ошибка SSL: certificate_verify_failed при очистке https://www.thenewboston.com/
  • Самоподписанный SSL-прием на Android
  • curl: (60) SSL-сертификат: не удалось получить сертификат локального эмитента
  • Поддерживает ли Android Volley SSL?
  • Выбор SSL-сертификата клиента в Java
  • С HTTPS, являются ли URL и заголовки запросов защищенными как тело запроса?
  • Добавить постоянное исключение SSL-сертификата в Chrome (Linux)
  • Предупреждение о соединении SSL при подключении к базе данных MySQL
  • прием HTTPS-соединений с самозаверяющими сертификатами
  • javax.net.ssl.SSLPeerUnverifiedException: имя хоста не соответствует теме сертификата, предоставленной партнером
  • Как исправить ошибку «java.security.cert.CertificateException: нет альтернативных имен объектов»?
  • Давайте будем гением компьютера.