Windows PowerShell から NuGet プロバイダーがインストールできなくなった原因と対処方法について

ちょっとした検証をするために、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

 

Azure PowerShell Windows PowerShell

コメント

スポンサーリンク
スポンサーリンク
kogesaka (Yu Kogasaka) をフォローする
焦げlog
タイトルとURLをコピーしました