6

这里有点奇怪的问题。我们使用的脚本是:

$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。如果我的怀疑是正确的,是否有参数我们可以指定/修改脚本以“修复”这个问题的方法?

非常感谢您的任何建议。

4

1 回答 1

5

我的预感是,这与 PowerShell 版本(或一般的底层平台细节)相关性较小,而与证书和 HTTPS 握手更相关。可能在识别证书中嵌入的备用主题名称方面有所改进,但测试它的一种简单方法是将这行 PowerShell 添加到您的脚本中:

[System.Net.ServicePointManager]::ServerCertificateValidationCallback = { $true }

这将导致所有证书都被接受 - 无论它们是否受信任、是否过期等。这是一个大锤子,在生产环境中使用它是不明智的,但它可能有助于诊断什么它在您的设置中进行。

您可以在 MSDN 页面上查看有关ServerCertificateValidationCallback的更多信息,包括它传递给委托的参数。理论上,您可以将您在该服务器上使用的证书列入白名单,并为该服务器返回 true。

于 2013-02-05T18:03:52.333 回答