Powershell Invoke-RestMethod证书验证

时间:2016-12-01 15:34:40

标签: rest powershell

我一直在使用已经工作了一年没有问题的脚本,调用Invoke-RestMethod到安全(https)站点,现在失败了。经过大量测试后,我发现我可以使呼叫失败一致且可重现任何安全站点请求,但我不知道为什么。以下代码失败。

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

产生的错误如下:

  

Invoke-RestMethod:底层连接已关闭:发送时发生意外错误。   在行:1个字符:1   + Invoke-RestMethod -Uri https://blogs.msdn.com/powershell/rss.aspx |格式表...   + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~         + CategoryInfo:InvalidOperation:(System.Net.HttpWebRequest:HttpWebRequest)[Invoke-RestMethod],WebException         + FullyQualifiedErrorId:WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand

我发现如果包含

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

上面一行,我得到了之前显示的错误。上述行为和错误实际上是应该发生的相反。以前,我无法在未将ServerCertificateValidationCallback指定为true的情况下发出https请求。

我在多台计算机上尝试过这种方法,在不同的Windows用户配置文件下,使用管理权限启动PowerShell,但我发现添加上述行可以让我重现问题。为了使其工作,我必须关闭PowerShell,重新打开它并删除ServerCertificateValidationCallback行。如果我将代码行添加到代码中,则会返回错误。

我上次运行代码的时间是两周前,因此我可以精确地确定时间范围。关于为什么现在失败的任何想法?

请注意,这是我最初遇到问题的网站,但我可以使用上述代码重现我遇到的问题。

1 个答案:

答案 0 :(得分: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()
    }
}

坏消息是基于更新,我回到了StackOverflow,因为这个星期某个时候停止工作......

如果您使用的是较旧版本的Powershell,您可能仍然对我发布的代码感到满意。