web-dev-qa-db-ja.com

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

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

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

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

180
hewstone

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

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

いくつかの投票を盗むための恥知らずな試みでは、SecurityProtocol[Flags]属性を持つEnumです。だからあなたはこれを行うことができます:

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

またはこれはPowerShellなので、文字列を解析してもらうこともできます。

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

それならあなたは技術的にTLSのバージョンを知る必要はありません。

この回答を読んだ後に作成したスクリプトからこれをコピーして貼り付けました。使用可能なすべてのプロトコルを調べて、うまく機能するものを見つけたくなかったためです。もちろん、あなたが望むのであれば、couldにしてください。

最後の注意 - 私は自分のPowerShellプロファイルに元の(マイナスSO編集)ステートメントを持っているので、今から始めるすべてのセッションにそれがあります。ただ失敗するサイトがまだいくつかあるので、それは完全に絶対確実というわけではありませんが、私は確かに問題のメッセージをはるかに少ない頻度で見ます。

129

これは私のために働いた

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

わたしにはできる...

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

私のように、上記のどれもまったくうまくいかない場合は、下位の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
Mark-DG1

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

0
Spencer