2016-12-01 83 views
1

我一直使用的是已經工作了一年沒有問題的腳本,使得要進行的調用,RestMethod到安全(HTTPS)網站,這是現在發生故障。在經過多次測試後,我發現我可以使呼叫始終如一地失敗,並可重複使用任何安全站點請求,但我不知道爲什麼。以下代碼失敗。Powershell的調用,RestMethod證書驗證

[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true} 
Invoke-RestMethod -Uri https://blogs.msdn.com/powershell/rss.aspx | Format-Table -Property Title, pubDate 

產生的誤差是:

調用-RestMethod:基礎連接已關閉:一個發送發生意外的錯誤。 在行:1個字符:1 +調用-RestMethod -uri https://blogs.msdn.com/powershell/rss.aspx |格式 - 表... + ~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~InvalidOperation:(System.Net.HttpWebRequest:HttpWebRequest)[Invoke-RestMethod],WebException + FullyQualifiedErrorId:WebCmdletWebResponseException ,Microsoft.PowerShell.Commands.InvokeRestMethodCommand

我發現,如果我包括

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

上面的行,我得到前面示出的錯誤。上述行爲和錯誤實際上是相對應的情況。以前,我無法在不分配ServerCertificateValidationCallback爲真的情況下發出https請求。

我已經從多臺計算機想這一點,在不同的Windows用戶配置文件,使用管理員權限啓動PowerShell的,但我覺得加入上述行讓我可以重現該問題。爲了使它工作,我必須關閉PowerShell,重新打開並刪除ServerCertificateValidationCallback行。如果我將該行添加到代碼中,則錯誤返回。

我最後一次跑到我的代碼是兩個星期前,所以這是狹義我可以精確的時間表。有關爲什麼現在失敗的任何想法?

請注意,這是不是該網站我原本有一個問題,但是,我面臨的問題可以用上面的代碼複製。

+0

[這可能有助於](http://stackoverflow.com/questions/36265534/invoke-webrequest-ssl-fails/36266735#36266735) –

回答

0

退房這裏的Huddled Masses blog的解決方案。

此基礎上,我開始使用這些:

function Disable-SslVerification 
{ 
    if (-not ([System.Management.Automation.PSTypeName]"TrustEverything").Type) 
    { 
     Add-Type -TypeDefinition @" 
using System.Net.Security; 
using System.Security.Cryptography.X509Certificates; 
public static class TrustEverything 
{ 
    private static bool ValidationCallback(object sender, X509Certificate certificate, X509Chain chain, 
     SslPolicyErrors sslPolicyErrors) { return true; } 
    public static void SetCallback() { System.Net.ServicePointManager.ServerCertificateValidationCallback = ValidationCallback; } 
    public static void UnsetCallback() { System.Net.ServicePointManager.ServerCertificateValidationCallback = null; } 
} 
"@ 
    } 
    [TrustEverything]::SetCallback() 
} 
function Enable-SslVerification 
{ 
    if (([System.Management.Automation.PSTypeName]"TrustEverything").Type) 
    { 
     [TrustEverything]::UnsetCallback() 
    } 
} 

的壞消息是,根據更新,我回來在計算器上,因爲停止了。這個星期我的工作......

如果你使用的是舊版本的Powershell,你可能對我發佈的代碼仍然很滿意。