公式ドキュメントや公式ブログのコマンドライン通りに入力したにもかかわらず、「PowerShellギャラリー」からモジュールをインストールしたり、更新したりできないといったトラブルをここ数カ月の間で経験した方はいないでしょうか。恐らくその原因は、PowerShellギャラリーにおける「TLS 1.0/1.1のサポート廃止」に関係しています。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
「PowerShellギャラリー(PowerShell Gallery)」は、「Windows PowerShell」(最新バージョンはWindows PowerShell 5.1)やクロスプラットフォームの「PowerShell Core」(最新バージョンはPowerShell 7.0)で使用するリソース(モジュールやスクリプト)のリポジトリです。
PowerShellギャラリーを利用すると、Microsoftやコミュニティーが作成したコンテンツを「Install-Module」や「Update-Module」コマンドレットを使用して簡単にインストールしたり、更新したりできます。
例えば、Azure PowerShellの「Az」モジュールや「Docker Enterprise 3.0」以前(3.1には非対応)のWindows Serverへのインストールを簡素化する「DockerMsftProvider」などのインストールや更新に利用できます。
TLS(Transport Layer Security)1.0/1.1の実装にはセキュリティ上の脆弱(ぜいじゃく)性があり、多くのWebサイトやサービスでこれらのセキュリティプロトコルのサポートが廃止されています。以下のMicrosoftのアナウンスにあるように、PowerShellギャラリーについては2020年4月にこれらのセキュリティプロトコルのサポートが廃止されました。現在は、TLS 1.2を使用する必要があります。
「Windows 10 バージョン1809」以降と「Windows Server 2019」以降は、TLS 1.2に標準で対応しており、PowerShellギャラリーにおけるセキュリティ強化の影響は受けません。
しかし、それ以前のバージョンのWindowsとWindows Serverについては、既定のセキュリティプロトコルがSSL(Secure Sockets Layer)3.0とTLS 1.0に設定されているため、そのままではTLS 1.2を要求するサービスへの接続やファイルのダウンロードに失敗します。
「Install-Module」や「Update-Module」コマンドレットは、現在、TLS 1.2を使用しなければPowerShellギャラリーに接続することはできず、次のようなエラーで失敗します(画面1、画面2)。
PowerShell ギャラリーは現在利用できません。後でやり直してください。
インターネット接続を確認してください。
この問題は、サポートライフサイクル期間中の以下のWindowsとWindows Serverに影響します。
この問題は、「Install-Module」や「Update-Module」コマンドレットを実行する前に現在のPowerShellセッション(ウィンドウ)で以下のコマンドラインを実行し、TLS 1.2の使用を明示的に指定することで簡単に回避できます(画面3)。
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
例えば、「Az」モジュールを新規インストールするには、次のように実行します。
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 Install-Module -Name Az -AllowClobber -Scope CurrentUser
なお、この方法によるTLS 1.2の明示的な指定は、現在のPowerShellセッション(ウィンドウ)と子ウィンドウのみで有効です。既にエラーが発生している場合は、影響を受けるモジュールが読み込み状態になっているため、エラーが解消しない場合があります。新しいPowerShellウィンドウを開始して実行してください。
「PowerShell Gallery TLS Support」では、「PowerShellGet」モジュールの更新バージョンをインストールすることで、その都度、TLS 1.2の使用を明示的に指定しなくても問題を回避する軽減策(Mitigation)も示されています。
具体的には、以下のコマンドラインを1回だけ実行します。1行目は2行目の「Install-Module」コマンドレットの実行時にエラーを回避するために必要です。
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 Install-Module PowerShellGet -RequiredVersion 2.2.4 -SkipPublisherCheck
「PowerShellGet」モジュールの更新後に新しいPowerShellウィンドウを開いて作業すると、「Install-Module」や「Update-Module」コマンドレットはTLS 1.2を明示的に指定しなくても接続エラーは発生しなくなります(画面4)。
更新された「PowerShellGet」モジュールは、現在のセキュリティプロトコル設定を保存した上でTLS 1.2に切り替え、呼び出し元に戻る際に保存されたセキュリティプロトコル設定を再現することで、問題の発生を抑制します。
ただし、「PowerShellGet」モジュールの関与しない別のモジュールやコマンドレットでTLS 1.2を必須とする接続(ファイルのダウンロードなど)が発生すれば、接続エラーは発生します。例えば、「Find-Package」コマンドによるパッケージの検索などです。その際、接続エラーやダウンロードエラーに遭遇した場合は、その都度、TLS 1.2の使用を明示的に指定して、問題が解消されないかどうかを確認してください(画面5)。
古いバージョンのWindowsとWindows ServerのTLS 1.2の対応状況については、「Japan IE Support Team Blog」のアーカイブ記事を参考にしてください。
岩手県花巻市在住。Microsoft MVP:Cloud and Datacenter Management(2019-2020)。SIer、IT出版社、中堅企業のシステム管理者を経て、フリーのテクニカルライターに。Microsoft製品、テクノロジーを中心に、IT雑誌、Webサイトへの記事の寄稿、ドキュメント作成、事例取材などを手掛ける。個人ブログは『山市良のえぬなんとかわーるど』。近著は『Windows版Docker&Windowsコンテナーテクノロジ入門』(日経BP社)、『ITプロフェッショナル向けWindowsトラブル解決 コマンド&テクニック集』(日経BP社)。
Copyright © ITmedia, Inc. All Rights Reserved.