Frage PowerShell v3 Invoke-WebRequest HTTPS-Fehler


Mit Invoke-WebRequest und Invoke-RestMethod von Powershell v3 habe ich erfolgreich die POST-Methode verwendet, um eine JSON-Datei auf einer https-Website zu veröffentlichen.

Der Befehl, den ich verwende, ist

 $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

Wenn ich jedoch versuche, die GET-Methode wie folgt zu verwenden:

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

Der folgende Fehler wird zurückgegeben

 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

Ich habe versucht, den folgenden Code zu verwenden, um SSL-Zertifikat zu ignorieren, aber ich bin nicht sicher, ob es tatsächlich irgendetwas tut.

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

Kann jemand eine Anleitung geben, was hier schief gehen könnte und wie man es beheben könnte?

Vielen Dank


76
2017-07-27 23:39


Ursprung


Antworten:


Dieses Workaround hat für mich funktioniert: http://connect.microsoft.com/PowerShell/feedback/details/419466/new-webserviceproxy-needs-force-parameter-to-ignore-ssl-errors

Grundsätzlich in Ihrem PowerShell-Skript:

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"

119
2018-04-05 19:20



Lees Antwort ist großartig, aber ich hatte auch Probleme mit den vom Webserver unterstützten Protokollen.
Nachdem ich auch die folgenden Zeilen hinzugefügt habe, konnte ich die https-Anfrage durchgehen lassen. Wie in dieser Antwort ausgeführt https://stackoverflow.com/a/36266735

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

Meine vollständige Lösung mit Lees Code.

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

30
2017-09-16 13:43



Hast du es versucht? 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



Ich habe festgestellt, dass ich diese Callback-Funktion verwendet habe, um SSL-Zertifikate zu ignorieren [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}

Ich habe immer die Fehlermeldung erhalten Invoke-WebRequest : The underlying connection was closed: An unexpected error occurred on a send. Das klingt wie die Ergebnisse, die Sie haben.

ich habe das gefunden Forenbeitrag was mich zu der unten stehenden Funktion führt. Ich führe dies einmal im Rahmen meines anderen Codes und es funktioniert für mich.

Funktion Ignorieren-SSLCertificates
{
    $ Provider = New-Object Microsoft.CSharp.CSharpCodeProvider
    $ Compiler = $ Provider.CreateCompiler ()
    $ Params = New-Object System.CodeDom.Compiler.CompilerParameter
    $ Params.GenerateExecutable = $ false
    $ Params.GenerateInMemory = $ true
    $ Params.IncludeDebugInformation = $ false
    $ Params.ReferencedAssemblies.Add ("System.DLL")> $ null
    $ TASource = @ '
        Namespace Local.ToolkitExtensions.Net.CertificatePolicy
        {
            Öffentliche Klasse TrustAll: System.Net.ICertificatePolicy
            {
                public bool CheckValidationResult (System.Net.ServicePoint sp, System.Security.Cryptography.X509Certificates.X509Certificate cert, System.Net.WebRequest req, int Problem)
                {
                    Rückkehr wahr;
                }
            }
        }
"@
    $ TAResults = $ Provider.CompileAssemblyFromSource ($ Params, $ TASource)
    $ TAAssembly = $ TAResults.CompiledAssembly
    ## Wir erstellen eine Instanz von TrustAll und hängen sie an den ServicePointManager an
    $ TrustAll = $ TAAssembly.CreateInstance ("Local.ToolkitExtensions.Net.CertificatePolicy.TrustAll")
    [System.Net.ServicePointManager] :: CertificatePolicy = $ TrustAll
}


4
2018-03-26 00:50



Das Folgende funktionierte für mich (und verwendet die neuesten nicht veralteten Methoden zur Interaktion mit der SSL-Certs / Callback-Funktion) und versucht nicht, denselben Code mehrmals innerhalb derselben Powershell-Sitzung zu laden:

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();

Dies wurde aus dem folgenden Artikel angepasst https://d-fens.ch/2013/12/20/nobrainer-ssl-connection-error-when-using-powershell/


4
2017-08-02 19:33



Ich habe versucht, auf der EM7 OpenSource REST API nach Dokumentation zu suchen. Bisher kein Glück.

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

Es wird viel über die OpenSource-REST-API gesprochen, aber keine Verbindung zur eigentlichen API oder Dokumentation. Vielleicht war ich ungeduldig.

Hier sind einige Dinge, die Sie ausprobieren können

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

Versuchen Sie dies, um zu sehen, ob Sie die Spalten filtern können, die Sie von der API erhalten

$a.Results | ft

oder, Sie können dies auch versuchen

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

Wellung Stil Header

$b.Headers

Ich habe das IRM / IWR mit dem Twitter JSON api getestet.

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

Hoffe das hilft.


0
2017-08-01 03:21



  1. Führen Sie diesen Befehl aus

Neu-SelfSignedCertificate -certstorelocation cert: \ localmachine \ mein-dnsname {your-site-hostname}

in Powershell mit Administratorrechte, Dadurch werden alle Zertifikate im persönlichen Verzeichnis generiert

  1. Um den Datenschutzfehler loszuwerden, wählen Sie diese Zertifikate aus, klicken Sie mit der rechten Maustaste → Kopieren. Fügen Sie die vertrauenswürdigen Stammzertifizierungsstellen / Zertifikate ein.
  2. Der letzte Schritt besteht darin, die richtigen Bindungen in IIS auszuwählen. Wechseln Sie zur IIS-Website, aktivieren Sie das Kontrollkästchen Bindungen, SNI auswählen und legen Sie die einzelnen Zertifikate für jede Website fest.

Stellen Sie sicher, dass der Hostname der Website und das Zertifikat dns-name genau übereinstimmen


0
2018-05-26 14:37