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