有没有人找到一种方法来强制 Powershell TLS 客户端不使用 SNI,或者通过服务器的 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)
非常感谢!