Кто-нибудь нашел способ заставить клиента PowerShell TLS не использовать SNI или продолжить соединение с ошибкой SNI с сервера?Powershell WebClient отказывается от обнаружения ошибки SNI
Я пытаюсь сделать сценарий powershell загрузить большой список сетей с нашего DHCP-сервера и форматировать его для импорта в другую систему.
Я могу загрузить данные в браузере - наблюдая за подключением к Wireshark, я вижу, что браузер запускает рукопожатие TLS, отправляет индикацию SNI, сервер отвечает «Предупреждением TLS (уровень: предупреждение, описание: нераспознанное имя)) ", браузер продолжает соединение TLS невозмутимым, и загрузка будет успешной.
Чтобы отладить запросы, я запустил соединение через локальный прокси (пакет burp, который является Java-приложением), поэтому я мог видеть как зашифрованный туннель, так и содержимое HTTP-запроса. Это вызвало отказ подключения и прокси-сервер немедленно вернуть ошибку. По-видимому, код Java TLS не хочет продолжать подключаться к ошибке TLS, которую браузеры делают в шаге. Если я заставляю прокси-сервер не включать идентификатор имени сервера (SNI) в запросе, он работает (см. Ниже код отлаживаемого кода).
Наконец, удалив прокси-сервер из микса, кажется, что сетевой код Powershell также не хочет продолжать проходить мимо ошибки - он отправляет один и тот же индикатор SNI, получает ту же ошибку TLS, а затем просто зависает - больше нет пакетов обменены, пока не прошло 100 секунд, то соединение закрывается с пакетом FIN и Powershells возвращает ошибку тайм-аут:
Exception calling "DownloadFile" with "2" argument(s): "The operation has timed out"
код, я использую это:
$webclient = new-object System.Net.WebClient
#DEBUG for now - send requests through proxy
#$proxy = new-object System.Net.WebProxy
#$proxy.Address = "http://localhost:8080"
#$webclient.proxy = $proxy
# have to do this to ignore invalid certs from proxy
#[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
#Also have to force the JRE running the proxy to not send SNI in the request - invoke as
#java -Djsse.enableSNIExtension=false -jar c:\Users\MarkS\Burp\burpsuite_pro_v1.6.09.jar
#end DEBUG
$server = $(
$input = Read-Host "server to connect to [our-DHCP-server-name]"
if($input) {$input} else {"our-DHCP-server-name"}
)
$current_id = [Environment]::Username
$user_id = $(
$input = Read-Host "user ID to connect as [$current_id]"
if($input) {$input} else {$current_id}
)
$password = Read-Host -AsSecureString 'password to connect with'
$pscreds = new-object System.Management.Automation.PSCredential($user_id,$password)
$webclient.Credentials = new-object System.Net.NetworkCredential($user_id, $pscreds.GetNetworkCredential().Password)
#connect...
$tempfile = [System.IO.Path]::GetTempFileName()
$tempfile
#...and download
#NOTE - don't use XML - server returns badly malformed XML
$url = "https://$server/wapi/v1.2.1/network?_max_results=10000000&_return_type=json-pretty&_return_fields%2B=extattrs"
$webclient.DownloadFile($url, $tempfile)
Большое спасибо!