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 свойство метода, используемого для пользовательской проверки клиентом сертификат сервера.
просто добавьте этот бевор ваш Invoke-RestMethod
или Invoke-WebMethod
.
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = { $true }