Powershell Invoke-WebRequestがSSL / TLSセキュアチャネルで失敗する


254

このPowerShellコマンドを実行しようとしています

Invoke-WebRequest -Uri https://apod.nasa.gov/apod/

そして私はこのエラーを受け取ります。「Invoke-WebRequest:要求は中止されました:SSL / TLSセキュアチャネルを作成できませんでした。」 httpsリクエストは機能しているように見えますが( " https://google.com ")、これは問題のリクエストではありません。これを機能させるにはどうすればよいですか、または他のpowershellコマンドを使用してページのコンテンツを読み取るにはどうすればよいですか?


回答:


537

これを使ってみてください

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Invoke-WebRequest -Uri https://apod.nasa.gov/apod/

48
デフォルトでは、PowerShellはTLS 1.0を使用します。サイトのセキュリティにはTLS 1.2が必要です
Chandan Rai

3
なぜ、サイトのTLSバージョンをどのように決定したのですか?
hewstone 2017年

16
SSLLabsを試して情報を確認します 。SSLレポート:apod.nasa.govに TLS1.1とTLS1.2が表示されます
Christopher G. Lewis

1
これを行う方法がもう少し永続的ですか?これは機能しますが、すべてのコンソールウィンドウでリセットされるようです。
ブランドン


166

いくつかの票を盗もうとする恥知らずな試みでSecurityProtocolEnum[Flags]属性があります。だからあなたはこれを行うことができます:

[Net.ServicePointManager]::SecurityProtocol = 
  [Net.SecurityProtocolType]::Tls12 -bor `
  [Net.SecurityProtocolType]::Tls11 -bor `
  [Net.SecurityProtocolType]::Tls

または、これはPowerShellなので、文字列を解析することができます。

[Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls"

そうすれば、技術的にTLSバージョンを知る必要はありません。

この回答を読んだ後に作成したスクリプトからこれをコピーして貼り付けましたが、使用可能なすべてのプロトコルを循環して機能するプロトコルを見つけたくありませんでした。もちろん、必要に応じてそれを行うことができます。

最後のメモ-PowerShellプロファイルに元の(SOの編集を除いた)ステートメントがあるので、これから開始するすべてのセッションにあります。失敗するだけのサイトがまだあるので、それは完全に万能というわけではありませんが、問題のメッセージはそれほど頻繁に表示されません。


7
SSLv3を使用するサイトにアクセスする必要がある場合は、が必要になり[Net.ServicePointManager]::SecurityProtocol = "Tls12, Tls11, Tls, Ssl3"ます。SSLv3とTLSv1.0はPOODLEのため非推奨になっているので、自己責任で使用してください。
jordanbtucker 2018年

すべてのNet.SecurityProtocolTypeタイプを許可するためにリフレクションを使用する方法はありませんか?ある必要があります
red888

デフォルトで既知の欠陥のあるプロトコルへのアクセスを許可したいのはなぜですか?とにかく、私は、PowerShell V7の差し迫った(この記事の執筆時点での)リリースがこの問題にいつでも対処できると信じており、この質問はその正当で十分に得られた忘却に徐々に消えていくでしょう。
返金なし返品不可

2

私のように、上記のいずれもうまく機能しない場合は、より低いバージョンのTLSを単独で試してみる価値もあります。私は次の両方を試しましたが、私の問題を解決していないようです:

[Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls"
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 -bor [Net.SecurityProtocolType]::Tls11 -bor [Net.SecurityProtocolType]::Tls

結局、それが機能したのは、TLS 1.0をターゲットにしたとき(具体的にはコードの1.1と1.2を削除したとき)だけでした。

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls

ローカルサーバー(これが試行されていた)はTLS 1.2で問題ありませんが、リモートサーバー(以前はサードパーティによってTLS 1.2で問題がないことが確認されていました)は問題がないようです。

これが誰かを助けることを願っています。


1

わたしにはできる...

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

Invoke-WebRequest -Uri https://apod.nasa.gov/apod/

1
この回答は、実質的にセキュリティチェックを無効にします。それはエラーを取り除くかもしれませんが、それは多くの人が受け入れられないと考える方法であなたのデバイス攻撃面を開きます。私が所有しているデバイスではこれを使用しません。
返金不可返品不可

1

最初にシェルを切り替えてください:

SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]

RUN [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 
RUN Invoke-WebRequest -UseBasicParsing -Uri  'https://github.com/git-for-windows/git/releases/download/v2.25.1.windows.1/Git-2.25.1-64-bit.exe' -OutFile 'outfile.exe'

0

理由はわかりませんが、.pfx証明書(現在のユーザーとローカルマシンの両方)を再インストールするとうまくいきます。


どの.pfxを再インストールしましたか?
返金不可返品不可

@NoRefundsNoReturnsリクエストの送信に使用する証明書ファイル。
スペンサー、

これが質問にどのように当てはまるかはまだわかりません。
返金不可返品不可

@NoRefundsNoReturns Invoke-WebRequestローカルでは、最初は機能しますが、後で失敗します。証明書をもう読めないように見える(その背後にあるメカニズムがわからない。たぶん会社が管理している設定なのかもしれない)。ただし、この場合、証明書を再インストールすると機能します。
Spencer

証明書の秘密キーを紛失した場合、確かに証明書が使用できなくなる可能性がありますが、ここでは問題だと思います。キーを紛失した場合は、秘密キーを保存し、永続的としてマークする必要があります。これが起こっているかどうか、新しい質問をしてください。
返金不可返品不可
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.