【问题标题】:Powershell Invoke-RestMethod certificate validationPowershell Invoke-RestMethod 证书验证
【发布时间】:2017-04-16 07:49:55
【问题描述】:

我一直在使用一个已经运行了一年而没有问题的脚本,向安全 (https) 站点调用 Invoke-RestMethod,但现在失败了。经过大量测试后,我发现对于任何安全站点请求,我可以使调用始终失败并且可重现,但我不知道为什么。以下代码失败。

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

产生的错误如下:

Invoke-RestMethod:底层连接已关闭:发送时发生意外错误。 在行:1 字符:1 + 调用-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 行。如果我将该行添加到代码中,则会返回错误。

我最后一次运行我的代码是在两周前,所以我能确定的时间范围很窄。关于为什么现在失败的任何想法?

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

【问题讨论】:

标签: rest powershell


【解决方案1】:

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,您可能仍然可以很好地使用我发布的代码。

【讨论】:

    猜你喜欢
    • 2016-07-27
    • 1970-01-01
    • 2015-02-04
    • 2014-08-31
    • 2018-01-29
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多