Powershell v3 Invoke-błąd https WebRequest

Używając programu PowerShell v3 Invoke-WebRequest i Invoke-RestMethod z powodzeniem użyłem metody POST, aby opublikować plik json na stronie https.

Komenda, której używam to

 $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 w stylu:

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

Zwracany jest następujący błąd

 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

Próbowałem użyć poniższego kodu, aby zignorować certyfikat SSL, ale nie jestem pewien, czy faktycznie coś robi.

 [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
[[4]}Czy ktoś może podać jakieś wskazówki na temat tego, co może się tu nie udać i jak to naprawić?

Dzięki

Author: svick, 2012-07-28

9 answers

Ta praca zadziałała dla mnie: http://connect.microsoft.com/PowerShell/feedback/details/419466/new-webserviceproxy-needs-force-parameter-to-ignore-ssl-errors

Zasadniczo w 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"
 125
Author: Lee Grissom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-05 19:20:05

Odpowiedź Lee jest świetna, ale miałem również problemy z którymi protokołami obsługiwał serwer WWW.
Po dodaniu następujących linii mogłem uzyskać żądanie https. Jak wskazano w niniejszej 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
 35
Author: AndOs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-16 13:43:25

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
Author: Sunny Chakraborty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-10 02:00:23

Odkryłem, że kiedy użyłem tej funkcji zwrotnej do ignorowania certyfikatów SSL [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}

Zawsze dostaję komunikat o błędzie {[2] } który brzmi jak wyniki, które masz.

Znalazłem ten post na forum, który doprowadził mnie do funkcji poniżej. Uruchamiam to raz wewnątrz zakresu mojego innego kodu i działa dla mnie. {[0]}

 5
Author: Aaron D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-26 00:50:20

Poniższe działanie zadziałało dla mnie (i używa najnowszych nie przestarzałych środków do interakcji z certyfikatami SSL / funkcją callback) i nie próbuje załadować tego samego kodu wiele razy w ramach 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 zaadaptowane z następującego artykułu https://d-fens.ch/2013/12/20/nobrainer-ssl-connection-error-when-using-powershell/

 4
Author: Arthur Strutzenberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-02 19:33:29

Próbowałem szukać dokumentacji na EM7 opensource REST API. Na razie bez powodzenia.

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

Dużo mówi się o opensource REST API, ale nie ma linku do rzeczywistego 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 tego, aby sprawdzić, czy możesz odfiltrować kolumny, które otrzymujesz z API

$a.Results | ft

Lub, ty można spróbować użyć tego również

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

Nagłówki W Stylu Curl

$b.Headers

Przetestowałem IRM / IWR za pomocą interfejsu API twitter JSON.

$a = Invoke-RestMethod http://search.twitter.com/search.json?q=PowerShell 
Mam nadzieję, że to pomoże.
 1
Author: Sunny Chakraborty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-01 03:21:16
  1. Uruchom to polecenie

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

W powershell używając praw administratora , spowoduje to wygenerowanie wszystkich certyfikatów w katalogu osobistym
  1. aby pozbyć się błędu Prywatności, wybierz te certyfikaty, kliknij prawym przyciskiem myszy → Kopiuj. I wklej w zaufany główny urząd certyfikacji / Certyfikaty.
  2. ostatnim krokiem jest wybranie prawidłowych wiązań w IIS. Przejdź na stronę IIS, wybierz Powiązania, zaznacz pole wyboru SNI i ustaw poszczególne certyfikaty dla każdej witryny.

Upewnij się, że nazwa hosta i nazwa DNS certyfikatu powinny dokładnie pasować

 0
Author: Mohit Dharmadhikari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-26 14:37:24

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

 0
Author: Autonomic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-21 17:08:37

Te ustawienia rejestru wpływają na. Net Framework 4+ , a tym samym PowerShell. Ustaw je i uruchom ponownie wszystkie sesje PowerShell, aby używać najnowszego TLS, bez potrzeby ponownego uruchamiania.

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 

Zobacz https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls#schusestrongcrypto

 0
Author: Jeremy Cook,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-05 22:10:56