自己証明書利用環境でPowerShellを利用してパッケージがインストールできない

2020-04-29


はじめに

かなりはまったのですが、テスト環境(Windows Server 2016)でPowershellを利用してAWS関連のの処理
を行うために、AWS Tools for PowerShell をインストールしようとした際にインストールができない問題が発生した。

 

PS C:\WINDOWS\system32>Install-Module -Name AWS.Tools.Installer
警告: URI 'https://go.microsoft.com/fwlink/?LinkID=627338&clcid=0x409' から '' へダウンロードできません。
警告: 利用可能なプロバイダーの一覧をダウンロードできません。インターネット接続を確認してください。
PackageManagement\Install-PackageProvider : プロバイダー 'NuGet' について、指定された検索条件に一致するものが見つかりま
せんでした。パッケージ プロバイダーには 'PackageManagement' タグと 'Provider' タグが必要です。指定されたパッケージにこ
れらのタグがあるかどうかを確認してください。
発生場所 C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\PSModule.psm1:7405 文字:21
+ ...     $null = PackageManagement\Install-PackageProvider -Name $script:N ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (Microsoft.Power...PackageProvider:InstallPackageProvider) [Install-Pac
   kageProvider]、Exception
    + FullyQualifiedErrorId : NoMatchFoundForProvider,Microsoft.PowerShell.PackageManagement.Cmdlets.InstallPackagePro
   vider

そこで、下記サイトを参考に対応を実施してみたが、解消はしなかった
Powershellでパッケージがインストールできない問題

 

PowerShell 6.0にフォーカスして、言語仕様と実践的な利用方法を解説したガイドブックです。

 

別の問題を検証

TLSでの接続問題ではなく、もしかしたら別の問題かと思い、下記を実行してみた。

Invoke-WebRequest "https://go.microsoft.com/fwlink/?LinkID=627338&clcid=0x409"

すると、証明書回りで引っかかってることが判明

Invoke-WebRequest : 接続が切断されました: SSL/TLS のセキュリティで保護されているチャネルに対する信頼関係を確立でき
んでした。
発生場所 行:1 文字:1
+ Invoke-WebRequest "https://go.microsoft.com/fwlink/?LinkID=627338&clc ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest]、We
    ption
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

問題はSSL証明書が信頼できないよ~ってことでした。
そこで、下記のように対応することで問題なくいけました。

 

 

対応

Install-Moduleを実行するまえに、下記の分をコピーして実行します。

Add-Type @"
   using System.Net;
   using System.Security.Cryptography.X509Certificates;
   public class TrustAllCertsPolicy : ICertificatePolicy {
      public bool CheckValidationResult(
         ServicePoint srvPoint, X509Certificate certificate,
         WebRequest request, int certificateProblem) {
         return true;
      }
   }
"@
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy

上記を実行後にInstall-Modleを実行すると問題なく動作しました

Install-Module -Name AWS.Tools.Installer

 

最後に

いかがでしたでしょうか。
本番環境等は、基本的に自己証明書ではなくちゃんとした証明書を導入していますが、テスト環境や動作確認環境ではどうしても自己証明書で対応することが多いかと思います。

同じような方がいましたら参考にしてもらえるといいかなと思います。