使用PowerShell中的System.Net.WebClient访问带有SAN证书的HTTPS URL

时间:2013-02-05 14:59:06

标签: .net powershell webclient powershell-v2.0 powershell-v3.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)

从我的桌面(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"

...它有效,但这并不理想(如果将服务移动到另一台机器,脚本将会中断)。

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

非常感谢您的任何建议。

1 个答案:

答案 0 :(得分:5)

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

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

这将导致所有证书被接受 - 无论它们是否受信任,过期等等。这是一个很大的问题,在生产环境中使用它并不明智,但它可能是有用的帮助诊断你的设置中发生了什么。

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