web-dev-qa-db-fra.com

Invoke-RestMethod - Ignorer les certificats auto-signés

Il semble que cette question ait été posée et répondue, mais jusqu'à présent, chaque solution que je rencontre n'aide pas. J'écris un script PowerShell pour exécuter des API REST pour obtenir des informations sur l'utilisation. Mon script s'arrête immédiatement juste en essayant de communiquer avec le serveur. Pour tester, je fais une commande très simpliste :

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

Il revient avec cette erreur:

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

Je peux exécuter la même commande mais avec l'URL google.com et j'obtiens un retour valide, donc je sais que la commande fonctionne de manière générale.

Si j'exécute l'équivalent curl sur le serveur lui-même, les choses se terminent comme prévu. Voici un extrait de la sortie détaillée de la commande curl:

* 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.

Je suppose seulement qu'il s'agit d'un problème de certificat auto-signé basé sur la recherche de l'erreur assez générique renvoyée par PowerShell.

J'ai essayé:

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

et d'autres méthodes similaires (fonctions complexes) pour aider à ignorer les problèmes de certificat sans succès.

J'utilise PowerShell 5 au cas où cela aiderait.

Je suis décent avec le code PowerShell mais c'est la première fois que j'essaie Invoke-RestMethod, alors peut-être que je manque quelque chose. Toute idée est appréciée.

11
firestarter247

J'ai étudié le même problème, la meilleure ressource que j'ai trouvée était ce billet de blog:

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

3
user5635168

Cela fonctionnera également dans les versions ultérieures de PowerShell avec invoke-restmethod/webrequest. Il évite la nécessité d'un espace d'exécution en implémentant le gestionnaire en tant que .net natif:

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

J'espère que cela t'aides.

15
x0n