web-dev-qa-db-ja.com

Invoke-RestMethod-自己署名証明書を無視する

この質問は尋ねられて答えられたようですが、今のところ私が出会ったすべての解決策は役に立たない。 PowerShellスクリプトを作成して、REST APIを使用して使用情報を取得します。スクリプトは、サーバーと通信しようとするとすぐに壊れます。テストのために、非常に単純なコマンドを実行しています。 :

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

このエラーで戻ります:

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

同じコマンドを実行できますが、URL google.comを使用すると有効なリターンが得られるため、コマンドが一般的に機能していることがわかります。

サーバー自体で同等のcurlを実行すると、期待どおりに処理が完了します。 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.

これは、PowerShellが返すかなり一般的なエラーの検索に基づいた自己署名証明書の問題であると想定しています。

私はもう試した:

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

そして、運のない証明書の問題を無視するのに役立つ他の同様の方法(複雑な機能)。

それが役立つ場合に備えて、PowerShell 5を実行しています。

PowerShellコードにはまともですが、Invoke-RestMethodを試すのは初めてなので、何かが足りないかもしれません。どんな洞察も大歓迎です。

11
firestarter247

私は同じ問題を調査してきましたが、見つけた最高のリソースは次のブログ投稿でした:

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

3
user5635168

これは、invoke-restmethod/webrequestを使用したpowershellの以降のバージョンでも機能します。ハンドラーをネイティブ.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()

お役に立てれば。

15
x0n