2013-02-05 33 views
6

這裏有一個奇怪的問題。我們正在使用的腳本是:在PowerShell中使用System.Net.WebClient訪問帶有SAN證書的HTTPS URL

$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中,PowerShell的V3使用.NET v4.0.30319)它的工作原理。 從服務器(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.100%29.aspx

http://msdn.microsoft.com/en-us/library/system.net.webclient%28v=vs.80%29.aspx 和.NET下V4爲它的文檔在正確的軌道上)。

理想情況下,我們希望該腳本在PowerShell v2和.NET v2下運行,而無需升級或強制PowerShell使用.NET v4。如果我的懷疑是正確的,那麼我們可以指定一個參數/一種修改腳本以「解決」這個問題的方法?

非常感謝您的任何建議。

+0

任何最終解決方案與完整的源代碼示例工作呢? – Kiquenet

+0

可悲的是。我無法得到下面的建議工作。我們正在將腳本遷移到Server 2012和PowerShell v3。 – Robin

+0

使用PS v3的任何示例? – Kiquenet

回答

4

我的預感是,這與PowerShell版本(或一般底層平臺詳細信息)較少有關,並且與證書和HTTPS握手更相關。它可以在那裏一直在承認嵌入證書中備用主題名稱的改進,但一個簡單的方法來測試這將是該行的PowerShell添加到您的腳本:

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

這將導致所有的證書是接受 - 無論他們是否值得信任,是否過期等等。這是一個很大的錘子,在生產環境中使用它並不明智,但它可能有助於診斷您的設置中發生了什麼。

您可以在MSDN頁面上看到關於ServerCertificateValidationCallback的更多信息,包括它傳遞給委託的參數。理論上,您可以將您在該服務器上使用的證書列入白名單,併爲該證書返回true。

相關問題