【Invoke-WebRequest】基礎になる接続が閉じられました

スポンサーリンク
TEST

1. 事象

Invoke-WebRequest コマンドでWebサイトに接続しようとすると下記のエラーメッセージが発生する。

PS> Invoke-WebRequest -URI 'https://win2012r2.com'
Invoke-WebRequest : 基礎になる接続が閉じられました: 送信時に、予期しないエラーが発生しました。
発生場所 行:1 文字:1
+ Invoke-WebRequest -URI 'https://win2012r2.com'
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest]、WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
Invoke-WebRequest : 基礎になる接続が閉じられました: 送信時に、予期しないエラーが発生しました。
Invoke-WebRequest : 基礎になる接続が閉じられました: 送信時に、予期しないエラーが発生しました。

2. エラーの原因

エラーの一因としてクライアント側で実行する Invoke-WebRequest コマンドが利用する暗号化プロトコルを接続先のWebサイトがサポートしていないことが考えられます。

例えば下図のように TLS1.2 のみをサポートしているWEBサイトに TLS1.0 で接続しようとすると接続を拒否されます。

ちなみに当サイト (https://win2012r2.com) は「さくらのレンタルサーバ スタンダード」を利用していますが提供元のさくらインターネットにより「TLS1.0/1.1」は無効化されています。

Invoke-WebRequest コマンドは .NetFramework 上で動作するコマンドで、.NetFramework の SecurityProtocol プロパティに設定されている暗号化プロトコルのバージョンを使用します。

.NET Framework で利用される既定のプロトコルバージョンは下記のとおりです。

No.バージョン既定のプロトコル備考
1.NET Framework 3.5 (3.5.1) SSL3.0 および TLS1.0既定ではTLS1.1 / TLS1.2 に未対応
2.NET Framework 4.5.2SSL3.0 および TLS1.0TLS1.1 / TLS1.2 に対応済み
3.NET Framework 4.6.xTLS1.0、1.1 および1.2 TLS1.1 / TLS1.2 に対応済み
4.NET Framework 4.7.xSystemDefaultOS の TLS の設定状態に依存
TLS1.1 / TLS1.2 に対応済み
.NET Framework で利用される既定のプロトコル バージョン

.NET Framework 3.5 (3.5.1) および、.NET Framework 4.5.2 では TLS 1.1 および 1.2が既定では有効になっていません。

3. 対応策

対応策. 1

この対応策では、プロトコルの変更はコマンドを実行したPowerShellのセッションのみで有効になります。PowerShellを閉じるとプロトコルの変更はリセットされます。

このエラーの大半はクライアント側で TLS1.2 を利用していないことに起因することが大半です。まずはクライアントでPowerShellを起動して [Net.ServicePointManager]::SecurityProtocol コマンドを実行してみてください。

PS> [Net.ServicePointManager]::SecurityProtocol
Ssl3, Tls
PS>

コマンドの実行結果から SSL3TLS1.0 が利用されていることがわかります。 次に[Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12 コマンドを実行して利用するプロトコルに TLS1.2 を追加にします。

PS> [Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12
PS>

※上記のコマンドは1行で実行してください

利用しているプロトコルを確認すると TLS1.2 が有効になっていることがわかります。

PS> [Net.ServicePointManager]::SecurityProtocol
Ssl3, Tls, Tls12
PS>

改めて Invoke-WebRequest コマンドでリクエストを実行すると正常に接続できることが確認できます。

PS>  Invoke-WebRequest -URI 'https://win2012r2.com'


StatusCode        : 200
StatusDescription : OK
Content           : <!doctype html>
                    <html lang="ja">

                    <head>
                    <meta charset="utf-8">
                    <meta http-equiv="X-UA-Compatible" content="IE=edge">
                    <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit...
RawContent        : HTTP/1.1 200 OK
                    Transfer-Encoding: chunked
                    Connection: keep-alive
                    Link: <https://win2012r2.com/wp-json/>; rel="https://api.w.org/"
                    Pragma: no-cache
                    Cache-Control: no-store, no-cache, must-revalid...
Forms             : {, , }
Headers           : {[Transfer-Encoding, chunked], [Connection, keep-alive], [Link, <https://win2012r2.com/wp-json/>; r
                    el="https://api.w.org/"], [Pragma, no-cache]...}
Images            : {@{innerHTML=; innerText=; outerHTML=<img class="site-logo-image header-site-logo-image" alt="Windo
                    ws 実践ガイド" src="https://win2012r2.com/win2012r2/wp-content/uploads/2022/02/20220205_header_logo
                    .png">; outerText=; tagName=IMG; class=site-logo-image header-site-logo-image; alt=Windows 実践ガイド" <以下略>

対応策. 2

対応策.1 の場合と異なり常に TLS1.2 が有効になります。

まずは対応策.1と同様に [Net.ServicePointManager]::SecurityProtocol コマンドを実行して現在利用しているプロトコルを確認してください。

PS> [Net.ServicePointManager]::SecurityProtocol
Ssl3, Tls
PS>

下記のレジストリを追加してください。

.NET Framework 3.5 (3.5.1) の TLS1.2を有効にするレジストリ設定

1つ目
  • キー: HKLM\SOFTWARE\Microsoft\.NETFramework\v2.0.50727
  • 名前: SystemDefaultTlsVersions
  • 種類: REG_DWORD
  • 値: 1
HKLM\SOFTWARE\Microsoft.NETFramework\v2.0.50727\SystemDefaultTlsVersions
HKLM\SOFTWARE\Microsoft.NETFramework\v2.0.50727\SystemDefaultTlsVersions
2つ目 ※64bit OSの場合
  • キー: HKLM\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v2.0.50727
  • 名前: SystemDefaultTlsVersions
  • 種類: REG_DWORD
  • 値: 1

.NET Framework 4.5.2 の TLS1.2を有効にするレジストリ設定

1つ目
  • キー: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft.NETFramework\v4.0.30319
  • 名前: SchUseStrongCrypto
  • 種類: REG_DWORD
  • 値: 1
2つ目 ※64bit OSの場合
  • キー: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft.NETFramework\v4.0.30319
  • 名前: SchUseStrongCrypto
  • 種類: REG_DWORD
  • 値: 1

対応後に改めて [Net.ServicePointManager]::SecurityProtocol コマンドでプロトコルを確認すると利用可能なプロトコルが追加されていることがわかります。

PS> [Net.ServicePointManager]::SecurityProtocol
Tls, Tls11, Tls12, Tls13
PS>

以上。

<参考>

コメント