Ошибка Powershell v3 Invoke-WebRequest HTTPS

Использование Powershell v3 Invoke-WebRequest и Invoke-RestMethod Я успешно использовал метод POST для публикации json файла на веб-сайте https.

Команда, которую я использую,

 $cert=New-Object System.Security.Cryptography.X509Certificates.X509Certificate2("cert.crt")
 Invoke-WebRequest -Uri https://IPADDRESS/resource -Credential $cred -certificate $cert -Body $json -ContentType application/json -Method POST

Однако, когда я пытаюсь использовать метод GET, например:

 Invoke-WebRequest -Uri https://IPADDRESS/resource -Credential $cred -certificate $cert -Method GET

Возвращается следующая ошибка

 Invoke-RestMethod : The underlying connection was closed: An unexpected error occurred on a send.
 At line:8 char:11
 + $output = Invoke-RestMethod -Uri https://IPADDRESS/resource -Credential $cred
 +           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest)      [Invoke-RestMethod], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand

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

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

Может ли кто-нибудь дать какое-то руководство по поводу того, что здесь может быть неправильным, и как его исправить?

Спасибо

Ответ 1

Эта работа работала для меня: http://connect.microsoft.com/PowerShell/feedback/details/419466/new-webserviceproxy-needs-force-parameter-to-ignore-ssl-errors

В основном, в PowerShell script:

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;
        }
    }
"@
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy

$result = Invoke-WebRequest -Uri "https://IpAddress/resource"

Ответ 2

Ответ Ли велик, но у меня также были проблемы с протоколами, поддерживаемыми веб-сервером.
После добавления следующих строк я могу получить запрос https. Как указано в этом ответе fooobar.com/questions/92857/...

$AllProtocols = [System.Net.SecurityProtocolType]'Ssl3,Tls,Tls11,Tls12'
[System.Net.ServicePointManager]::SecurityProtocol = $AllProtocols

Мое полное решение с кодом Ли.

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;
    }
}
"@
$AllProtocols = [System.Net.SecurityProtocolType]'Ssl3,Tls,Tls11,Tls12'
[System.Net.ServicePointManager]::SecurityProtocol = $AllProtocols
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy

Ответ 3

Вы пытались использовать System.Net.WebClient?

$url = 'https://IPADDRESS/resource'
$wc = New-Object System.Net.WebClient
$wc.Credentials = New-Object System.Net.NetworkCredential("username","password")
$wc.DownloadString($url)

Ответ 4

Следующее сработало для меня (и использует последние не устаревшие средства для взаимодействия с функциональностью SSL-сертификаты/обратного вызова) и не пытается загружать один и тот же код несколько раз в течение одного сеанса powershell:

if (-not ([System.Management.Automation.PSTypeName]'ServerCertificateValidationCallback').Type)
{
[email protected]"
    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
 }
[ServerCertificateValidationCallback]::Ignore();

Это было адаптировано из следующей статьи https://d-fens.ch/2013/12/20/nobrainer-ssl-connection-error-when-using-powershell/

Ответ 5

Я обнаружил, что при использовании этой функции обратного вызова для игнорирования сертификатов SSL [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}

Я всегда получал сообщение об ошибке Invoke-WebRequest: The underlying connection was closed: An unexpected error occurred on a send. что звучит как результаты, которые вы получаете.

Я нашел это сообщение на форуме, которое привело меня к функции ниже. Я запускаю это один раз в рамках моего другого кода, и это работает для меня.

 функция Ignore-SSLCertificates
 {
$ Provider = New-Object Microsoft.CSharp.CSharpCodeProvider
$ Compiler = $ Provider.CreateCompiler()
$ Params = New-Object System.CodeDom.Compiler.CompilerParameters
$ Params.GenerateExecutable = $ false
$ Params.GenerateInMemory = $ true
$ Params.IncludeDebugInformation = $ false
$ Params.ReferencedAssemblies.Add("System.DLL")> $ null
$ TASource = @"
 пространство имен Local.ToolkitExtensions.Net.CertificatePolicy
 {
 открытый класс TrustAll: System.Net.ICertificatePolicy
 {
 public bool CheckValidationResult (System.Net.ServicePoint sp, System.Security.Cryptography.X509Certificates.X509Сертификат сертификации, требование System.Net.WebRequest, проблема int)
 {
 вернуть истину;
 }
 }
 }
 @
$ TAResults = $ Provider.CompileAssemblyFromSource($ Params, $ TASource)
$ TAAssembly = $ TAResults.CompiledAssembly
## Мы создаем экземпляр TrustAll и присоединяем его к ServicePointManager
$ TrustAll = $ TAAssembly.CreateInstance("Local.ToolkitExtensions.Net.CertificatePolicy.TrustAll")
[System.Net.ServicePointManager] :: CertificatePolicy = $ TrustAll
 }

Ответ 6

Я попытался найти документацию по API-интерфейсу REST EM7 OpenSource. Пока не повезло.

http://blog.sciencelogic.com/sciencelogic-em7-the-next-generation/05/2011

Там много говорят об OpenSource REST API, но нет ссылки на фактический API или любую документацию. Может быть, я был нетерпелив.

Вот несколько вещей, которые вы можете попробовать

$a = Invoke-RestMethod -Uri https://IPADDRESS/resource -Credential $cred -certificate $cert 
$a.Results | ConvertFrom-Json

Попробуйте это, чтобы увидеть, можете ли вы отфильтровать столбцы, которые вы получаете из API

$a.Results | ft

или вы можете попробовать использовать это также

$b = Invoke-WebRequest -Uri https://IPADDRESS/resource -Credential $cred -certificate $cert 
$b.Content | ConvertFrom-Json

Заголовки стиля Curl

$b.Headers

Я тестировал IRM/IWR с помощью twitter JSON api.

$a = Invoke-RestMethod http://search.twitter.com/search.json?q=PowerShell 

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

Ответ 7

Альтернативная реализация в чистом (без Add-Type источника ):

#requires -Version 5
#requires -PSEdition Desktop

class TrustAllCertsPolicy : System.Net.ICertificatePolicy {
    [bool] CheckValidationResult([System.Net.ServicePoint] $a,
                                 [System.Security.Cryptography.X509Certificates.X509Certificate] $b,
                                 [System.Net.WebRequest] $c,
                                 [int] $d) {
        return $true
    }
}
[System.Net.ServicePointManager]::CertificatePolicy = [TrustAllCertsPolicy]::new()

Ответ 8

  • Запустите эту команду

New-SelfSignedCertificate -certstorelocation cert:\localmachine\my -dnsname {your-site-hostname}

в powershell с использованием прав администратора. Это приведет к созданию всех сертификатов в личном каталоге

  1. Чтобы избавиться от ошибки конфиденциальности, выберите эти сертификаты, щелкните правой кнопкой мыши → Копировать. И вставьте доверенный корневой центр сертификации/сертификаты.
  2. Последний шаг - выбрать правильные привязки в IIS. Перейдите на сайт IIS, выберите "Привязки", "Выбрать SNI" и установите индивидуальные сертификаты для каждого веб-сайта.

Убедитесь, что имя хоста веб-сайта и имя сертификата dns-name должны точно соответствовать

Ответ 9

Если вы запустите это как администратор, эта ошибка должна исчезнуть

Ответ 10

Эти параметры реестра влияют на .NET Framework 4+ и, следовательно, на PowerShell. Установите их и перезапустите все сеансы PowerShell, чтобы использовать последний TLS, перезагрузка не требуется.

Set-ItemProperty -Path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord 

См. Https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls#schusestrongcrypto