ちょっとした検証をするために、Windows Server 2016 環境に新規に Azure PowerShell (Az モジュール) を Windows PowerShell コンソールからインストールしようとした際、エラーとなり、インストールに失敗するという現象に遭遇しました。
エラー メッセージとしては、NuGet プロバイダーをインストールしようとするも、 ダウンロード先が見つからない、利用可能なプロバイダーが存在しないために失敗、というものでした。
インターネット接続は行えていること、また以前は問題なくインストールできていたことから、別の問題が発生していると思い、色々と調べてみたら原因と対応方法が分かったので、まとめてみました。
インストールできない原因について
NuGet プロバイダーのダウンロード、インストールが 2020 年 4 月以降で TLS 1.0/1.1 はサポートされず、TLS 1.2 のみをサポートすることが分かりました。
Windows Server 2016 は TLS 1.2 をサポートしているのでは?
Windows Server 2016 (というか、Windows Serer 2012/Windows 8.1 以降) は TLS 1.2 を標準サポート (有効) していますが、Windows Server 2016 の Windows PowerShell で使用される TLS のバージョンが既定で 1.0 となっていることが原因のようです。
Windows PowerShell コンソール上で以下のコマンドを実行することで、設定 (サポート) されているセキュリティ プロトコルを確認することが可能です。
[Net.ServicePointManager]::SecurityProtocol
Windows Server 2016 では、SSL3 と TLS (1.0) と設定されています。
ちなみに Windows Server 2019 は、TLS (1.0)、1.1、1.2 がサポートされているため、現象は発生しません。
Windows 10 においては、値が SysemDefault となっていますが、これは TLS (1.0)、1.1、1.2 が設定されているという意味となるため、現象が発生しません。
こんな落としな… 穴があったとは
対処方法について
※2020/05/18 追記。
対処方法について、以下の 3 4 つがあります。状況に合わせて対処してください。
- .Net Framework の既定値をレジストリで変更する
- Windows PowerShell のセッション内で TLS 1.2 に設定する
- PowerShell Core をインストール、使用する
- PowerShellGet モジュールを v2.2.4 以上にアップグレードする
.Net Framework の既定値をレジストリで変更する
コンソール上で、以下のコマンドを実行、レジストリ キーで構成されている .NET Framework の既定の TLSバージョンを 1.2 に変更することで回避可能です。
reg add HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 /v SystemDefaultTlsVersions /t REG_DWORD /d 1 /f /reg:64 reg add HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 /v SystemDefaultTlsVersions /t REG_DWORD /d 1 /f /reg:32
Windows PowerShell のセッション内で TLS 1.2 に設定する
Windows PowerShell のセッション内のみとなりますが、以下のコマンドで TLS 1.2 に設定することが可能です。これは、レジストリの編集ができない環境の場合に有効です。
[Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bOR [Net.SecurityProtocolType]::Tls12
PowerShell Core をインストール、使用する
PowerShell Core は既定で TLS (1.0)、1.1、1.2 がサポートされているため、インストール、PowerShell コンソール環境として使用することで、現象を回避することが可能です。
PowerShellGet モジュールを v2.2.4 以上にアップグレードする
PowerShellGet モジュールを v2.2.4 以上にアップグレードすることで TLS1.2 の使用を強制できるようです。
// @stknohg さん、情報ありがとうございます!!
参考 URL