PowerShellスクリプトを実行ポリシーの「AllSigned」で実行するには電子署名を付与する必要があります。この記事ではPowerShellスクリプトに署名する方法を紹介します。
実行ポリシーの詳細は以下の記事をご覧ください。
PowerShellスクリプトに署名する方法
署名には証明書を使用します。証明書には認証局から発行してもらった証明書と自己証明書のどちらも使用することができます。
検証環境や自環境で使用する分には自己証明書で問題ないですが、本番環境では認証局から発行してもらった証明書を使用するのが一般的ではないかと思います。
自己証明書を作成する
自己証明書で署名する場合は、まず自己証明書を作成しておく必要があります。自己証明書はPowerShellを管理者権限で開いて作成します。
- 「スタートボタン」右クリックするか、ショートカットキーの[Windows]キー + [X]キーを押下してアドバンストメニューを開きます。
- [Windows PowerShell (管理者)]をクリックします。
- 管理者権限でPowerShellを開いた後、「New-SelfSignaedCertificate」コマンドで自己証明書を作成します。
$cert = New-SelfSignedCertificate -Subject "CN=Self-signed certificate" ` -KeyAlgorithm RSA -KeyLength 2048 -Type CodeSigningCert ` -CertStoreLocation "Cert:\LocalMachine\My\" -NotAfter [有効期限]
コマンド例)$cert = New-SelfSignedCertificate -Subject "CN=Self-signed certificate" ` -KeyAlgorithm RSA -KeyLength 2048 -Type CodeSigningCert ` -CertStoreLocation "Cert:\LocalMachine\My\" -NotAfter 2030/12/31
- 作成した自己証明書を「Move-Item」コマンドで「信頼されたルート証明機関」に移動します。
Move-Item "Cert:\LocalMachine\My\$($cert.Thumbprint)" "Cert:\LocalMachine\Root"
作成した自己証明書を「信頼されたルート証明機関」に移動しない状態でPowerShellスクリプトを実行すると、以下の画像のようにエラーとなります。
PowerShellスクリプトに署名する
自己証明書が作成できたらPowerShellスクリプトに署名が可能です。
- PowerShellを管理者権限で開きます。
- 署名に使用する証明書を変数に取得します。
$cert=Get-ChildItem Cert:\LocalMachine\Root -CodeSigningCert
- PowerShellスクリプトに署名します。
Set-AuthenticodeSignature "[PowerShellスクリプトのフルパス]" $cert
署名されたスクリプトを開くと、元のPowerShellスクリプトの内容の後ろに電子署名が追記されています。
電子署名は認証局から発行された証明書を使用される場合でも同じコマンドで可能です。ただし、項番2の「Cert:\LocalMachine\Root」をインストールした証明書が保管されている場所に変更する必要があります。
「-CodeSigningCert」で署名用の証明書を取得していますが、複数個ある場合は「Where-Object」コマンド等で1つの証明書に絞る必要があります。
署名したPowerShellスクリプトについての注意
署名したPowerShellスクリプトについての注意点をいくつか記載します。
実行時の注意
PowerShellスクリプトに署名した後、初回実行時には確認メッセージが表示されます。
一度だけ実行する場合は[R]を入力しますが、[A]を入力すると、次回から確認メッセージを表示させずに実行することができます。
配布時の注意
署名したPowerShellスクリプトを別のWindowsで実行した場合はエラーになります。
エラーにせず実行するには、作成した自己証明書をエクスポートし、別のWindowsの「信頼されたルート証明機関」に登録しておく必要があります。
証明書の有効期限
証明書には有効期限があります。有効期限が切れると署名したスクリプトも使用できなくなります。その場合は、再度自己証明書を発行し、署名前のスクリプトに署名する必要があります。
スクリプトの修正
署名したスクリプトを修正したくなった時は、署名前のスクリプトを修正し、再度署名する必要があります。
署名したスクリプトをそのまま修正して実行した場合は、ハッシュが一致しないというエラーとなって実行できません。
コメント