Invoke-RestMethod - игнорировать подписанные сертификаты

Кажется, что этот вопрос был задан и получен ответ, но пока что каждое решение, с которым я сталкиваюсь, не помогает. Я пишу сценарий PowerShell для запуска некоторых API REST для получения информации об использовании. Мой скрипт ломается сразу, просто пытаясь связаться с сервером. Ради тестирования я делаю очень упрощенную команду:

Invoke-RestMethod 'https://server:4443/login'

Возвращается с этой ошибкой:

Invoke-RestMethod : The underlying connection was closed: An unexpected error occurred on a send.

Я могу выполнить ту же команду, но с URL-адресом google.com, и я получаю действительный возврат, поэтому я знаю, что команда работает в целом.

Если я запускаю эквивалент curl на самом сервере, все завершается, как и ожидалось. Вот фрагмент подробного вывода команды curl:

* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server key exchange (12):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSL connection using TLSv1.0 / DHE-RSA-AES256-SHA
* Server certificate:
*        subject: CN=localhost
*        start date: 2016-03-22 21:48:57 GMT
*        expire date: 2026-03-20 21:48:57 GMT
*        issuer: CN=localhost
*        SSL certificate verify result: self signed certificate (18), continuing anyway.

Я только предполагаю, что это самозаверяющая проблема с сертификатом, основанная на поиске довольно типичной ошибки, которую возвращает PowerShell.

Я пробовал:

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

и другие подобные методы (сложные функции), чтобы помочь игнорировать проблемы с сертификатами без удачи.

Я использую PowerShell 5 на случай, если это поможет.

Я неплохо справляюсь с кодом PowerShell, но я впервые пробую Invoke-RestMethod, так что, возможно, я что-то упустил. Любое понимание приветствуется.

3 ответа

Решение

Я искал ту же самую проблему, лучший ресурс, который я нашел, был этим сообщением в блоге:

http://huddledmasses.org/blog/validating-self-signed-certificates-properly-from-powershell/

Это также будет работать в более поздних версиях powershell с invoke-restmethod/webrequest. Это позволяет избежать требования к пространству выполнения, реализуя обработчик как собственный.net:

if (-not("dummy" -as [type])) {
    add-type -TypeDefinition @"
using System;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;

public static class Dummy {
    public static bool ReturnTrue(object sender,
        X509Certificate certificate,
        X509Chain chain,
        SslPolicyErrors sslPolicyErrors) { return true; }

    public static RemoteCertificateValidationCallback GetDelegate() {
        return new RemoteCertificateValidationCallback(Dummy.ReturnTrue);
    }
}
"@
}

[System.Net.ServicePointManager]::ServerCertificateValidationCallback = [dummy]::GetDelegate()

Надеюсь это поможет.

Если после ответа @x0n проблема не исчезла, попробуйте добавить перед Request/Rest this

[System.Net.ServicePointManager]::SecurityProtocol =[System.Net.SecurityProtocolType]::Tls12

Рабочий сценарий для меня:

if (-not ([System.Management.Automation.PSTypeName]'ServerCertificateValidationCallback').Type)
{
$certCallback = @"
    using System;
    using System.Net;
    using System.Net.Security;
    using System.Security.Cryptography.X509Certificates;
    public class ServerCertificateValidationCallback
    {
        public static void Ignore()
        {
            if(ServicePointManager.ServerCertificateValidationCallback ==null)
            {
                ServicePointManager.ServerCertificateValidationCallback += 
                    delegate
                    (
                        Object obj, 
                        X509Certificate certificate, 
                        X509Chain chain, 
                        SslPolicyErrors errors
                    )
                    {
                        return true;
                    };
            }
        }
    }
"@
    Add-Type $certCallback
 }

[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12;
[ServerCertificateValidationCallback]::Ignore()

Invoke-WebRequest https://*YOUR URI*

Я знаю, что это старый, но он все еще возникал, когда у меня был этот вопрос без фактической проверки. сначала гугл?

Попробуй это:

invoke-restMethod -SkipCertificateCheck -uri 'https://server:4443/login' -etc..etc..etc..

получил его здесь через Google: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/invoke-restmethod?view=powershell-6

У меня была аналогичная проблема, и моя версия PS была 5.1, я изначально использовал [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12

Но что-нибудь ниже Powershell6используйте политику сертификатов по ссылке ниже: https://gist.github.com/rchaganti/aae721ebccd25eaab0b8b3dd67ad4b9b

Это работает как шарм. Спасибо Рави Чаганти.

Я уже некоторое время борюсь с этой же проблемой. Я пробовал несколько вариантов таких скриптов, которые уже публиковались в этой теме. Я был удивлен, обнаружив, что, взяв тот же сценарий и запустив его на моей собственной рабочей станции, а не в моей тестовой среде, он работал.

В конце концов, я обнаружил, что, просто запустив сценарий в моей тестовой среде с использованием повышенных учетных данных (Запуск от имени администратора), он работал без ошибки SSL/TLS.

Приложение может установить для свойства ServerCertificateValidationCallback метод, который будет использоваться для пользовательской проверки клиентом сертификата сервера.

Источник: https://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.servercertificatevalidationcallback(v=vs.110).aspx

просто добавьте этот bevor ваш Invoke-RestMethod или же Invoke-WebMethod,

[System.Net.ServicePointManager]::ServerCertificateValidationCallback = { $true }
Другие вопросы по тегам