Rob*_*bin 6 .net powershell webclient powershell-2.0 powershell-3.0
这里有点奇怪的问题.我们使用的脚本是:
$username = "itrpo"
$url = "https://homepages.domain.com/cgi-bin/checkperms.cgi?user=$username"
$homepagesUser = "REMOVED"
$homepagesPass = "REMOVED"
$webclient = New-Object System.Net.WebClient
$webclient.Credentials = new-object System.Net.NetworkCredential($homepagesUser, $homepagesPass)
$result = $webclient.DownloadString($url)
Run Code Online (Sandbox Code Playgroud)
从我的桌面(Windows 8,使用.NET v4.0.30319的PowerShell v3)运行时,它可以正常运行.从服务器(Windows Server 2008 R2,使用.NET v2.0.50727的PowerShell v2)运行时,它不会.最终它会挂起并返回错误:使用"1"参数调用"DownloadString"的异常:"操作已超时"
使用NetMon我设法确定在服务器上它无法执行任何TLS客户端密钥交换.
homepages.domain.com的SSL证书实际上是一个SAN证书,主页是实际服务器名称的别名(我们称之为servera.domain.com).当我在脚本中更改$ url以使用实际的服务器名称时:
$url = "https://servera.domain.com/cgi-bin/checkperms.cgi?user=$username"
Run Code Online (Sandbox Code Playgroud)
...它工作正常,但这并不理想(如果将服务移动到另一台机器,脚本将会中断).
似乎PowerShell v2(.NET v2)出现SAN证书问题?支持这一点的进一步证据是我们将上述样式脚本用于另一台具有标准SSL证书的服务器,它可以很好地进行通信.
可能是因为正在使用的WebClient类的差异?以下是.NET v2下的文档:http: //msdn.microsoft.com/en-us/library/system.net.webclient%28v=vs.80%29.aspx 及其.NET下的文档v4:http: //msdn.microsoft.com/en-us/library/system.net.webclient%28v=vs.100%29.aspx
我不太了解编程以正确解释上述文档(或者知道我是否在正确的轨道上).
理想情况下,我们希望该脚本在PowerShell v2和.NET v2下运行,而无需升级或强制PowerShell使用.NET v4.如果我的怀疑是正确的,我们可以指定参数/修改脚本以"修复"此问题的方法吗?
非常感谢任何建议.
我的预感是,这与PowerShell版本(或一般的底层平台细节)关联性较低,与证书和HTTPS握手的关系更为密切.可能在识别证书中嵌入的备用主题名称方面有所改进,但测试它的简单方法是将这行PowerShell添加到您的脚本中:
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = { $true }
Run Code Online (Sandbox Code Playgroud)
这将导致所有证书被接受 - 无论它们是否可信,过期等.这是一个很大的问题,在生产环境中使用它是不明智的,但它可能有助于诊断什么它继续你的设置.
您可以在MSDN页面上查看有关ServerCertificateValidationCallback的更多信息,包括它传递给委托的参数.理论上,您可以将您在该服务器上使用的证书列入白名单,并为该服务器返回true.
| 归档时间: |
|
| 查看次数: |
22198 次 |
| 最近记录: |