Pytanie Powershell v3 Invoke-WebRequest Błąd HTTPS


Korzystanie z Invoke-WebRequest i Invoke-RestMethod Powershell v3 Z powodzeniem zastosowałem metodę POST, aby opublikować plik json w witrynie https.

Polecenie, którego używam, jest

 $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

Jednak gdy próbuję użyć metody GET, takich jak:

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

Następujący błąd jest zwracany

 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

Podjęto próbę użycia następującego kodu do zignorowania certyfikatu SSL, ale nie jestem pewien, czy faktycznie coś robi.

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

Czy ktoś może dostarczyć wskazówek na temat tego, co może być nie tak i jak to naprawić?

Dzięki


76
2017-07-27 23:39


pochodzenie


Więc którego używasz? Invoke-RestMethod lub Invoke-WebRequest? - svick
Invoke-WebRequest. Używam go, ponieważ zwraca nagłówki request / resposne w przeciwieństwie do Invoke-RestMethod. Jednak próbowałem Invoke-RestMethod, który również ma takie same parametry. - floyd
Co jest warte, sprawa ServerValidationCallback prawie na pewno jest czerwonym śledziem, ponieważ błąd, który powinieneś dostać, gdy masz problem z sprawdzaniem poprawności SSL, POWIEDZ SIEBIE, że: Invoke-WebRequest : The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.  Możesz spróbować odkryć błąd $ [0] .Exception.InnerException, aby uzyskać więcej informacji ... - Jaykul


Odpowiedzi:


To obejście zadziałało dla mnie: http://connect.microsoft.com/PowerShell/feedback/details/419466/new-webserviceproxy-needs-force-parametr-to-ignore-ssl-errors

Zasadniczo w twoim skrypcie PowerShell:

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"

120
2018-04-05 19:20



Uwaga, ta odpowiedź jest poprawna; jednak punkt w innej odpowiedzi (stackoverflow.com/a/25163476/68432) jest również ważny. To rozwiązanie nie zadziała, jeśli wcześniej wykonałeś "[System.Net.ServicePointManager] :: ServerCertificateValidationCallback = {$ true}". - Paul Suart
To działało dla mnie. - Trevor Sullivan
Musisz dodać test warunku Typu zgodnie z odpowiedzią Arthura Strutzenberga poniżej lub otrzymasz komunikat o błędzie informujący, że typ już istnieje - Ralph Willgoss
Czy istnieje ryzyko związane z bezpieczeństwem korzystania z tego w produkcji? - Amjad
5 lat później to wciąż jest rozwiązanie dla PowerShell 5.1 (pełna .NET Framework). Dla PowerShell Core istnieje -SkipCertificateCheck teraz. - evilSnobu


Odpowiedź Lee jest świetna, ale miałem też problemy z protokołami obsługiwanymi przez serwer WWW.
Po dodaniu kolejnych wierszy mogę uzyskać dostęp do żądania https. Jak wskazano w tej odpowiedzi https://stackoverflow.com/a/36266735

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

Moje pełne rozwiązanie z kodem Lee.

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

32
2017-09-16 13:43



czy znalazłeś lepsze rozwiązanie, bo jeśli masz 40 skryptów, to musisz je dodać? Wydaje się, że nie ma sensu. Przy okazji, dziękuję za odpowiedź - Ender
Odpowiedź Lee nie działa dla mnie. Musiałem dodać bity, do których się odwołałeś i IT WORKED! - Pat K
Dziękuję bardzo, określenie protokołów pomogło rozwiązać problem - Alex
Dziękuję, dziękuję, dziękuję, że mi pokazałeś SecurityProtocol globalna właściwość statyczna. Chryste, właśnie straciłem DAYS na sprawdzaniu certyfikatów, trustów, sieci, tras, zezwoleń i shitload innych rzeczy próbujących rozwiązać niejasne endpoint does not respondbłąd podczas uzyskiwania dostępu do jednego określonego serwera przez https (wszystkie inne działają), tylko dlatego, że ten przeklęty pakiet Power Shell 5.1 domyślnie korzysta z SSL3, TLS i JUST BLOKI GODDAMN TLS11 i TLS12 DOMYŚLNIE Boże, jak bardzo nienawidzę tego bzdura, powinienem napisać ten skrypt w C # / Ruby / C ++, czy cokolwiek innego, co nie jest powershell - quetzalcoatl
^ .... przynajmniej na WinServer2012R2 - quetzalcoatl


Czy próbowałeś użyć? 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)

8
2017-07-31 12:51



Sunny, otrzymuję następujące informacje podczas korzystania z tego kodu: Wyjątek wywołanie "DownloadString" z argumentami "1": "Serwer zdalny zwrócił błąd: (406) Not Acceptable." W linii: 4 char: 1 + $ wc.DownloadString ($ url) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ CategoryInfo: Not Specified: (:) [ ], MethodInvocationException + FullyQualifiedErrorId: WebException - floyd
Na podstawie dokumentacji API usługi REST im użycie 406 wskazuje "że nagłówek akceptacji zawarty w żądaniu nie pozwala na odpowiedź XML lub JSON" - floyd
Jakie typy odpowiedzi są dozwolone, jeśli odpowiedzi XML / JSON są niedozwolone? - Sunny Chakraborty
Czy jest to niestandardowa usługa internetowa, z której korzystasz? Czy istnieje publicznie dostępna dokumentacja interfejsu API REST? - Sunny Chakraborty
To jest system biletowy o nazwie EM7 Nie sądzę, że mają dokumenty publiczne. Usługa nie akceptuje odpowiedzi JSON / XML (działa dobrze, jeśli używam cURL). Wierzę, że błąd wskazuje, że System.Net.WebClient nie jest? - floyd


Zauważyłem, że kiedy użyłem tej funkcji wywołania zwrotnego, aby zignorować certyfikaty SSL [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}

Zawsze otrzymałem komunikat o błędzie Invoke-WebRequest : The underlying connection was closed: An unexpected error occurred on a send. co brzmi jak wyniki, które masz.

znalazłem to post na forum które doprowadziły mnie do poniższej funkcji. Uruchomiłem to raz w zasięgu mojego drugiego kodu i działa to dla mnie.

funkcja 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 = @ '
        przestrzeń nazw Local.ToolkitExtensions.Net.CertificatePolicy
        {
            klasa publiczna TrustAll: System.Net.ICertificatePolicy
            {
                public bool CheckValidationResult (System.Net.ServicePoint sp, System.Security.Cryptography.X509Certificates.X509Certificate cert, System.Net.WebRequest req, int problem)
                {
                    return true;
                }
            }
        }
"@
    $ TAResults = $ Provider.CompileAssemblyFromSource ($ Params, $ TASource)
    $ TAAssembly = $ TAResults.CompiledAssembly
    ## Tworzymy instancję TrustAll i dołączamy ją do ServicePointManager
    $ TrustAll = $ TAAssembly.CreateInstance ("Local.ToolkitExtensions.Net.CertificatePolicy.TrustAll")
    [System.Net.ServicePointManager] :: CertificatePolicy = $ TrustAll
}


4
2018-03-26 00:50





Następujący pracowali dla mnie (i używają najnowszych nieinterwencyjnych środków do interakcji z funkcjami SSL Certs / callback) i nie próbują załadować tego samego kodu wiele razy w tej samej sesji powershell:

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
 }
[ServerCertificateValidationCallback]::Ignore();

Zostało to zmienione z następującego artykułu https://d-fens.ch/2013/12/20/nobrainer-ssl-connection-error-when-using-powershell/


4
2017-08-02 19:33





Próbowałem szukać dokumentacji interfejsu API REST EM7 OpenSource. Do tej pory nie było szczęścia.

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

Dużo się mówi o OpenSource REST API, ale nie ma linku do faktycznego interfejsu API ani żadnej dokumentacji. Może byłem niecierpliwy.

Oto kilka rzeczy, które możesz wypróbować

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

Spróbuj sprawdzić, czy możesz odfiltrować kolumny, które otrzymujesz z interfejsu API

$a.Results | ft

lub możesz spróbować również tego użyć

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

Nagłówki stylu zwinięcia

$b.Headers

Przetestowałem IRM / IWR z apiksem JSON na twitterze.

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

Mam nadzieję że to pomoże.


1
2017-08-01 03:21



Dziękuję za twoją pomoc. Jednak pierwsze polecenie $ a = Invoke-RestMethod (...) jest tym, które aktualnie nie działa dla mnie. Działa dobrze dla strony HTTP, ale kiedy wprowadzasz HTTPS, który robi EM7, zwraca błąd opisany. To jest dla Invoke-RestMethod i Invoke-WebRequest. Jestem w trakcie używania cmdletu Invoke-Command i uruchamiania curl. - floyd


  1. Uruchom to polecenie

New-SelfSignedCertificate -certyfikat certyfikatu_lokalnego: \ localmachine \ moja -nazwa_adomości {nazwa-twojej-strony-hosta}

w użyciu programu Power Shell prawa administratora, Spowoduje to wygenerowanie wszystkich certyfikatów w katalogu osobistym

  1. Aby usunąć błąd prywatności, wybierz te certyfikaty, kliknij prawym przyciskiem myszy → Kopiuj. I wklej do Zaufanego głównego urzędu certyfikacji / certyfikatów.
  2. Ostatnim krokiem jest wybranie poprawnych powiązań w IIS. Przejdź do witryny IIS, zaznacz opcję Wiązania, zaznacz pole wyboru SNI i ustaw poszczególne certyfikaty dla każdej witryny.

Upewnij się, że nazwa hosta witryny i nazwa dns-certyfikatu dokładnie pasują do siebie


0
2018-05-26 14:37





Jeśli uruchomisz to jako administrator, błąd ten powinien zniknąć


0
2018-06-21 17:08