Вызывается 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 вообще.
- Force SSL / HTTPS с mod_rewrite
- HTTPS GET (SSL) с Android и самозаверяющим сертификатом сервера
- Как восстановить отсутствующий сертификат IIS Express SSL?
- Как реализовать идентификацию имени сервера (SNI)
- Установка SSL на сервере Wamp: ошибка в httpd-ssl.conf
- Динамические изображения, переданные через HTTPS, отображают сломанное изображение в слове при открытии HTTP-документа
- Подписанный SSL-сертификат третьей стороны для localhost или 127.0.0.1?
- ошибка установки пакета с ошибкой проверки сертификата SSL
- Java: загрузка SSL Keystore через ресурс
- Как я могу работать с NET: ERR_CERT_AUTHORITY_INVALID в Chrome?
- Предупреждения Firefox «Неверное подключение» при посещении уважаемых сайтов HTTPS при использовании учетной записи ребенка
- Доверяйте всем сертификатам okHttp
- java - игнорировать сертификат 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