2014-12-12 3 views
2

Кто-нибудь нашел способ заставить клиента 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) 

Большое спасибо!

ответ

0

У меня есть своеобразное решение. Работа, которая работает для меня; он по-прежнему не является решением общего назначения.

Добавление:

[System.Net.ServicePointManager]::SecurityProtocol = 'Ssl3' 

перед попыткой подключения заставит на стороне клиента, чтобы использовать только SSLv3 (который этот сервер настроен на поддержку), которая предотвращает SNI от вступления в игру, так как это TLS только функция ,

Конечно, это не помогло бы никому пытаться подключиться к серверу, поддерживающему только TLS, и это только помогает мне, пока SSLv3 остается на нашем сервере ...