PowerShellで自己署名証明書を発行して証明書ストアのルート証明書にコピーする方法

公開:

Webアプリケーションの開発では自己署名証明書が使いたくなることがあります。サーバーがWindows + Internet Information Service(IIS)であれば作成は次の方法で行えます。

  • IISマネージャーで作成
  • PowerShellのコマンドレットで作成

手軽なのはIISマネージャーでの作成ですが小回りが利きません。一方PowerShellコマンドレットでの作成はこまかい指定が可能ですがIIS向けの証明書ストア登録が十分ではありません。Webを検索するとMicrosoft管理コンソール(MMC)のスナップインで証明書ストアにアクセスして手動でルート証明書にコピーするやりかたが散見されます。

手動でのルート証明書コピーを紹介されているエントリは、その当時はPowerShellでは自動化できなかったために手動の操作を紹介しているのかもしれません。本エントリ記述時点の最新のPowerShellであれば証明書プロバイダーが提供されているので、次のスクリプトで自己署名証明書の作成からルート証明書へのコピーまで一括で行えます。

$HostName = hostname
$Cert = New-SelfSignedCertificate -DnsName $HostName, "localhost" -CertStoreLocation "Cert:\LocalMachine\My"
$CertPath = Join-Path -Path "Cert:\LocalMachine\My" -ChildPath $Cert.Thumbprint
$TempPassword = ConvertTo-SecureString -String $([System.Security.Membership]::GeneratePassword(16, 3)) -AsPlainText -Force
$ExportFilePath = Join-Path -Path $([System.IO.Path]::GetTempPath()) -ChildPath "SelfSignedCertificate.pfx"
Export-PfxCertificate -Cert $CertPath -FilePath $ExportFilePath -Password $($TempPassword)
Import-PfxCertificate -FilePath $ExportFilePath -CertStoreLocation "Cert:\LocalMachine\Root" -Password $($TempPassword)
Remove-Item -Path $ExportFilePath

ポイントは次。

  • Microsoft管理コンソールの証明書スナップインは信頼されたルート証明書へのコピーをサポートしますが、PowerShellの証明書プロバイダーはコピーをサポートしません。ですが一度ファイルにエクスポートしてからインポートすれば同等の処理が実現できます
  • PFX形式(.pfx)でエクスポートする際はパスワードの指定が必要です。パスワードは .NET FrameworkクラスライブラリのSystem.Security.Membership.GeneratePasswordを使うと自動生成できます
  • ConvertTo-SecureStringForce パラメータはPowerShell 7以降は不要とのことです

すこし手間が減りますので、よろしければお使いください。