2016-04-06 12 views
4

Es scheint, als ob diese Frage gestellt und beantwortet wurde, aber bisher hilft mir jede Lösung, die ich finde, nicht. Ich schreibe ein PowerShell-Skript, um einige REST-APIs auszuführen, um Nutzungsinformationen zu erhalten. Mein Skript bricht sofort ab und versucht nur, mit dem Server zu kommunizieren. Zum Testen willen, mache ich einen sehr simplen Befehl:Invoke-RestMethod - Ignoriere selbst signierte Certs

Invoke-RestMethod 'https://server:4443/login' 

Es gibt mit diesem Fehler:

Invoke-RestMethod : The underlying connection was closed: An unexpected error occurred on a send. 

Ich kann den gleichen Befehl aber mit URL google.com laufen und ich bekomme eine gültige Ich weiß, dass der Befehl im Allgemeinen funktioniert.

Wenn ich die Curl-Äquivalent auf dem Server selbst ausführen, werden die Dinge wie erwartet abgeschlossen. Hier ist ein Ausschnitt der ausführlichen Ausgabe des curl Befehls:

* SSLv3, TLS handshake, Client hello (1): 
* SSLv3, TLS handshake, Server hello (2): 
* SSLv3, TLS handshake, CERT (11): 
* SSLv3, TLS handshake, Server key exchange (12): 
* SSLv3, TLS handshake, Server finished (14): 
* SSLv3, TLS handshake, Client key exchange (16): 
* SSLv3, TLS change cipher, Client hello (1): 
* SSLv3, TLS handshake, Finished (20): 
* SSLv3, TLS change cipher, Client hello (1): 
* SSLv3, TLS handshake, Finished (20): 
* SSL connection using TLSv1.0/DHE-RSA-AES256-SHA 
* Server certificate: 
*  subject: CN=localhost 
*  start date: 2016-03-22 21:48:57 GMT 
*  expire date: 2026-03-20 21:48:57 GMT 
*  issuer: CN=localhost 
*  SSL certificate verify result: self signed certificate (18), continuing anyway. 

ich nur davon aus, dies ist eine selbst signierte Zertifikat Ausgabe basierend auf den ziemlich allgemeinen Fehler sucht Powershell zurückzugibt.

Ich habe versucht:

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

und andere ähnliche Methoden (komplexe Funktionen) zu helfen Zertifikat Fragen ohne Glück zu ignorieren.

Ich benutze PowerShell 5, falls das hilft.

Ich bin anständig mit PowerShell-Code, aber das ist mein erstes Mal versuchen, Invoke-RestMethod, also vielleicht ich etwas fehlt. Jeder Einblick wird geschätzt.

+0

Vielleicht vermissen Sie Ihre Anmeldeinformationen, wenn der Webserver auth ('-Credential') benötigt. Oder Sie müssen '-Method'-Parameter' post' oder '' get' 'angeben. Es ist schwer zu sagen, wenn wir nicht wissen, was Ihr Server erwartet. –

+0

Ich entschuldige mich dafür, keine vollständigen Informationen im Voraus zu geben. Ich gebe Anmeldeinformationen über Header. Ich habe versucht, die Methode auch explizit aufzurufen. – firestarter247

Antwort

2

Ich habe in das gleiche Problem suchen, die beste Ressource, die ich fand, war dieser Blog-Post:

http://huddledmasses.org/blog/validating-self-signed-certificates-properly-from-powershell/

+0

Das hat super funktioniert. Vielen Dank! – firestarter247

+0

Die Erklärung in dem von Ihnen angegebenen Link war sehr hilfreich. Ich habe einen "Unerwarteter Fehler bei einem Sendefehler" erhalten, als ich versucht habe, eine beliebige Methode zur manuellen Änderung von '[System.Net.ServicePointManager] :: ServerCertificateValidationCallback' zu verwenden. Es war frustrierend, weil es so aussah, als hätte es funktionieren müssen, um durch diesen Rückruf zurück zu kommen. – petrsnd

0

An application can set the ServerCertificateValidationCallback property to a method to use for custom validation by the client of the server certificate.

Quelle: https://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.servercertificatevalidationcallback(v=vs.110).aspx

nur fügen Sie diese Bevor Ihr Invoke-RestMethod oder Invoke-WebMethod.

+1

Das funktioniert nicht wirklich. Sie werden nur erhalten "Ein unerwarteter Fehler ist bei einem Senden aufgetreten."Wenn Sie Invoke-RestMethod oder Invoke-WebRequest aufrufen. Siehe den Link von @Tav. – petrsnd

+0

Dann gibt es ein anderes Problem, starten Sie die Software Fiddler und überwachen Sie diese Anfrage. –

1

Dies funktioniert auch in späteren Versionen von Powershell mit Invoke-Restmethod/Webrequest. Es vermeidet die Notwendigkeit für einen Runspace durch die Implementierung der Handler als native. NET:

if (-not("dummy" -as [type])) { 
    add-type -TypeDefinition @" 
using System; 
using System.Net; 
using System.Net.Security; 
using System.Security.Cryptography.X509Certificates; 

public static class Dummy { 
    public static bool ReturnTrue(object sender, 
     X509Certificate certificate, 
     X509Chain chain, 
     SslPolicyErrors sslPolicyErrors) { return true; } 

    public static RemoteCertificateValidationCallback GetDelegate() { 
     return new RemoteCertificateValidationCallback(Dummy.ReturnTrue); 
    } 
} 
"@ 
} 

[System.Net.ServicePointManager]::ServerCertificateValidationCallback = [dummy]::GetDelegate() 

Hoffe, dies hilft.