我一直在使用已经工作了一年没有问题的脚本,调用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行。如果我将代码行添加到代码中,则会返回错误。
我上次运行代码的时间是两周前,因此我可以精确地确定时间范围。关于为什么现在失败的任何想法?
请注意,这是不我最初遇到问题的网站,但我可以使用上述代码重现我遇到的问题。
答案 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,您可能仍然对我发布的代码感到满意。