这里有点奇怪的问题。我们使用的脚本是:
$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)
从我的桌面(Windows 8,使用 .NET v4.0.30319 的 PowerShell v3)运行它时,它可以工作。从服务器(Windows Server 2008 R2、PowerShell v2 使用 .NET v2.0.50727)运行它时,它不会。最终它挂起并返回错误:使用“1”参数调用“DownloadString”的异常:“操作已超时”
使用 NetMon,我设法确定在服务器上它未能执行任何 TLS 客户端密钥交换。
homepages.domain.com 的 SSL 证书实际上是一个 SAN 证书,homepages 是实际服务器名称的别名(我们称之为 servera.domain.com)。当我在脚本中更改 $url 以使用实际的服务器名称时:
$url = "https://servera.domain.com/cgi-bin/checkperms.cgi?user=$username"
...它起作用了,但这并不理想(如果将服务移动到另一台机器上,脚本将中断)。
似乎 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。如果我的怀疑是正确的,是否有参数我们可以指定/修改脚本以“修复”这个问题的方法?
非常感谢您的任何建议。