Invoke-RestMethod-Игнорировать Самозаверяющие Сертификаты

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

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. Это позволяет избежать требования к runspace, реализуя обработчик как собственный .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()

надеюсь, что это помогает.


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

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

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

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