null

Invoke-WebRequest куда смотреть при unexpected error: TLS, SSL

Опишу возможные варианты поиска и решения проблем возникновения ошибок

System.Net.Http.HttpRequestException: The SSL connection could not be established
The underlying connection was closed: An unexpected error occurred on a send.

Проявляться может при вызове Invoke-WebRequest с операционной системы Windows:

+ Invoke-WebRequest -URI https://nodejs.org/dist/v16.14.2/node-v16.14.2 ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebExc
   eption
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

 

В Event viewer при этом могут возникать ошибки вида:

EventID	36871

A fatal error occurred while creating an SSL client credential. The internal error state is 10013.
Schannel

 

EventID	36874

An SSL 2.0 connection request was received from a remote client application, but none of the cipher suites supported by the client application are supported by the server. The SSL connection request has failed.

 

1. Просмотр какие протоколы используются на целевой странице

Через браузер (не системный) или другую систему смотрим в инструментах разработчика что используется, например:

Protocol
TLS 1.3
Key exchange group
X25519
Cipher
AES_128_GCM

2. Настройки SSL и TLS

Согласно документации Microsoft настраиваем параметры TLS в реестре.

Пример включения TLS 1.2. Client

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp\
      DefaultSecureProtocols = (DWORD): 0xAA0
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp\
      DefaultSecureProtocols = (DWORD): 0xAA0

настройки производить в параметрах реестра:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client]
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client]
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client]
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Client]
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Client]
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server]
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server]
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server]
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server]
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server]

Включить базово использование протоколов можно через системное окно настроек обозревателя, например для SSL 3.0

Internet Options > Advanced > Settings > Security > Use SSL 3.0.

Дополнительно можем задать подключение после активаци в реестре из коммандной строки и попробовать 

[Net.ServicePointManager]::SecurityProtocol = "tls13, tls12, tls11, tls,SSL3"

3. Настройки алгоритмов шифрования

В реестре в ветке 

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL

проверяем не выключены ли протоколы шифрования 

4. Обновляем .netFramework до версии поддерживающей протоколы

В частности TLS 1.3 используется в .netFramework 4.8. В ОС до windows server 2016 может отсутствовать поддержка (зависит от обновлений) - в этом случае используем ОС с поддержкой требуемых протоколов.

TLS 1.

Посмотреть какие .NetFramework используются в системе можно из PowerShell

Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse | Get-ItemProperty -Name version -EA 0 | Where { $_.PSChildName -Match '^(?!S)\p{L}'} | Select PSChildName, version