.net - 在 PowerShell 中使用 System.Net.WebClient 通过 SAN 证书访问 HTTPS URL

标签 .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)

当从我的桌面(Windows 8、使用 .NET v4.0.30319 的 PowerShell v3)运行此程序时,它可以工作。 当从服务器(Windows Server 2008 R2、使用 .NET v2.0.50727 的 PowerShell v2)运行此命令时,则不会。最终它挂起并返回错误:使用“1”个参数调用“DownloadString”时发生异常:“操作已超时”

使用 NetMon,我设法确定服务器上无法执行任何 TLS 客户端 key 交换。

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

非常感谢您的建议。

最佳答案

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

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

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

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

关于.net - 在 PowerShell 中使用 System.Net.WebClient 通过 SAN 证书访问 HTTPS URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14710449/

相关文章:

.net - 有没有一种方法可以训练 Encog 神经网络而不将所有训练集加载到内存中?

c# - 如何从YouTube获取视频下载链接?

powershell - 遍历CSV并创建一个数组

powershell - 将日期而非日期添加到文件名的脚本

windows - cmd/powershell : minimize all windows on your desktop except for current command prompt (console) or except for some particular window

时间:2019-03-17 标签:c#asyncwebclient

c# - 如何视觉上连接2个圈子?

.net - 你用 ASP.NET MVC Action 方法做了什么聪明的事情

c# - 如何在 WebClient.DownloadStringAsync URL 中使用字符串

C# 连接网页并进行身份验证