2016-12-01 84 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,你可能对我发布的代码仍然很满意。