PowerShell подключается к API отдыха с самозаверяющим сертификатом. - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь вызвать API отдыха на устройстве, однако оно использует самозаверяющий сертификат для сокета https.Я попытался изменить следующее в PowerShell

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

Но при выполнении моего вызова, используя следующее,

$uri = 'https://hostname/api/config'
$headers = @{"Authorization"="token apitokengoeshere"}
try {
Invoke-RestMethod -Uri $uri -Headers $headers
}
catch {
$_.Exception |format-list -force
}

, но я все еще получаю следующую ошибку

Status         : SendFailure
Response       :
Message        : The underlying connection was closed: An unexpected 
error occurred on a send.
Data           : {}
InnerException : System.IO.IOException: Unable to read data from the 
                transport connection: An existing connection was forcibly closed by the remote host. ---> System.Net.Sockets.SocketException: An existing connection       was forcibly closed by the remote host
               at System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult)
               at System.Net.Sockets.NetworkStream.EndRead(IAsyncResult asyncResult)
                --- End of inner exception stack trace ---
                at System.Net.TlsStream.EndWrite(IAsyncResult asyncResult)
                at System.Net.ConnectStream.WriteHeadersCallback(IAsyncResult ar)
TargetSite     : System.Net.WebResponse 
GetResponse(System.Net.WebRequest)
StackTrace     :    at Microsoft.PowerShell.Commands.WebRequestPSCmdlet.GetResponse(WebRequest request)
                    at Microsoft.PowerShell.Commands.WebRequestPSCmdlet.ProcessRecord()
HelpLink       :
Source         : Microsoft.PowerShell.Commands.Utility
HResult        : -2146233079

Я даже пытался установить модуль Tunable-SSL Powershell, как упоминалось в блоге, упомянутом Здесь в предыдущем вопросе.

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Я чувствую вашу боль.

У вас есть два варианта.Во-первых, если вы используете Powershell 6.0, вы можете полностью игнорировать сертификат вместе с параметром -SkipCertificateCheck :

Invoke-RestMethod -Method Get -Uri 'https://jsonplaceholder.typicode.com/p
osts/1' -SkipCertificateCheck

ПРИМЕЧАНИЕ. У меня Powershell 6.0 дляпроверить это.Возможно, вам придется разделить параметр.Начните с этого, говорите, если это не работает.

Во-вторых, вы можете загрузить сертификат из службы, отправить его со своим сценарием (если вы доверяете ему), и при вызове службы убедитесь, что его сертификатсоответствует доверенному, который поставляется с вашим скриптом.Это можно сделать несколькими способами:

$certificate = ...load-your-cert...
Invoke-RestMethod -Method Get -Uri 'https://jsonplaceholder.typicode.com/p
osts/1' -Certificate $certificate

Если сертификат находится в вашем хранилище сертификатов, вы также можете указать его отпечаток.

0 голосов
/ 11 мая 2018

У меня есть простой скрипт, который я написал для проверки состояния кода результата на страницах HTTPS с самозаверяющими сертификатами.

Из-за большого количества поисков это я и закончил:

Add-Type @"
    using System.Net;
    using System.Security.Cryptography.X509Certificates;
    public class TrustAllCertsPolicy : ICertificatePolicy {
        public bool CheckValidationResult(
            ServicePoint srvPoint, X509Certificate certificate,
            WebRequest request, int certificateProblem) {
            return true;
        }
    }
"@ -ea SilentlyContinue -wa SilentlyContinue    

Затем следует прямо перед вызовом Invoke-WebRequest: [System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...