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
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.2 | SSL3.0 および TLS1.0 | TLS1.1 / TLS1.2 に対応済み |
3 | .NET Framework 4.6.x | TLS1.0、1.1 および1.2 | TLS1.1 / TLS1.2 に対応済み |
4 | .NET Framework 4.7.x | SystemDefault | OS の TLS の設定状態に依存 TLS1.1 / TLS1.2 に対応済み |
.NET Framework 3.5 (3.5.1) および、.NET Framework 4.5.2 では TLS 1.1 および 1.2が既定では有効になっていません。
3. 対応策
対応策. 1
このエラーの大半はクライアント側で TLS1.2 を利用していないことに起因することが大半です。まずはクライアントでPowerShellを起動して [Net.ServicePointManager]::SecurityProtocol コマンドを実行してみてください。
PS> [Net.ServicePointManager]::SecurityProtocol
Ssl3, Tls
PS>
コマンドの実行結果から SSL3 と TLS1.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
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>
以上。
<参考>
コメント