「このスクリプトは信頼できるものなのか?」
「企業環境でPowerShellスクリプトを安全に使いたいけど、セキュリティポリシーで実行できない…」
そんな場面で重要になるのが「スクリプト署名(コード署名)」です。
PowerShellでは Set-AuthenticodeSignature
コマンドレットを使って、.ps1 スクリプトに電子署名を追加することが可能です。
この記事では、Set-AuthenticodeSignature
の基本的な使い方から、証明書の準備方法、企業環境での運用方法までを初心者にもわかりやすく解説します。
Set-AuthenticodeSignatureとは?

Set-AuthenticodeSignature
は、PowerShellスクリプトにコード署名(デジタル署名)を付与するためのコマンドレットです。
署名されたスクリプトは「信頼できる発行者からのもの」として扱われ、厳しい実行ポリシー(例:AllSigned)でも実行可能になります。
なぜスクリプトに署名する必要があるのか?
署名の主な目的はセキュリティ強化と改ざん防止です。
スクリプト署名のメリット:
- 組織ポリシーで
AllSigned
を有効にしてもスクリプトが実行可能 - スクリプトの改ざん検出が可能(署名無効化)
- エンドユーザーに「信頼されたスクリプト」として提示可能
特に企業ネットワークでは、署名なしスクリプトはブロックされる場合があるため、署名は実質必須です。
署名に使う証明書の準備方法

方法①:自己署名証明書を使う(開発・テスト向け)
New-SelfSignedCertificate `
-DnsName "powershell.local" `
-CertStoreLocation "Cert:\CurrentUser\My" `
-Type CodeSigningCert `
-Subject "PowerShell Code Signing"
上記で作成された証明書は、自分のマシン上で署名に使用可能です。
方法②:社内CAや商用CAで取得する(本番向け)
Active Directory Certificate Services(AD CS)や、DigiCert などの認証局からコード署名用証明書を発行してもらいましょう。
自己署名証明書を信頼ストアに追加する方法
作成した自己署名証明書を信頼されたルート証明機関に移動する例:
# 証明書を取得
$cert = Get-ChildItem -Path Cert:\CurrentUser\My -CodeSigningCert | Where-Object {$_.Subject -like "*PowerShell Code Signing*"}
# 信頼されたルート証明機関ストアにコピー(開発環境のみ)
$store = New-Object System.Security.Cryptography.X509Certificates.X509Store("Root", "CurrentUser")
$store.Open("ReadWrite")
$store.Add($cert)
$store.Close()
基本的な使い方とサンプルコード

証明書を取得(最初の1つを使用):
$cert = Get-ChildItem -Path Cert:\CurrentUser\My -CodeSigningCert | Select-Object -First 1
スクリプトに署名を付ける:
Set-AuthenticodeSignature -FilePath "C:\Scripts\myscript.ps1" -Certificate $cert
タイムスタンプを付与する場合(推奨):
Set-AuthenticodeSignature -FilePath "C:\Scripts\myscript.ps1" -Certificate $cert -TimestampServer "http://timestamp.digicert.com"
実行後、スクリプトの末尾にデジタル署名が付与されます。
タイムスタンプを使用すると、証明書の有効期限が切れた後もスクリプトを実行できます。
署名後のスクリプト検証方法(Get-AuthenticodeSignature)
署名の有効性を確認するには以下を使用します:
Get-AuthenticodeSignature -FilePath "C:\Scripts\myscript.ps1"
myscript.ps1
は自身のスクリプト。
出力例:
Status : Valid
SignerCertificate : [証明書情報]
TimeStamperCertificate : [タイムスタンプ情報]
IsOSBinary : False
Status: Valid
なら、スクリプトの改ざんはなく、署名が有効です。
署名ステータスには以下の種類があります:
Valid
– 署名は有効HashMismatch
– ハッシュ不一致NotSigned
– 署名がないUnknownError
– 検証中にエラーが発生
よくあるエラーと対処法

エラー | 原因・対策 |
---|---|
No signature certificate was found | コード署名用証明書がインストールされていないか、PowerShellから検出できていない。-CodeSigningCert 付きで確認を。 |
The signature is not valid | スクリプトが署名後に変更された可能性。再署名が必要。 |
Set-AuthenticodeSignature : Access denied | スクリプトファイルの書き込み権限がない。管理者権限 またはファイルのプロパティを確認。 |
Failed to open the target path | パスが間違っているか、ファイルにアクセスできない。パスの正確性とアクセス権を確認。 |
実行ポリシーの設定方法:
# 署名されたスクリプトのみ実行可能にする
Set-ExecutionPolicy AllSigned -Scope CurrentUser
# リモートスクリプトのみ署名が必要(ローカルは不要)
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
まとめ:スクリプト署名でPowerShellの安全性を向上しよう
Set-AuthenticodeSignature
を使えば、PowerShellスクリプトに信頼性とセキュリティを追加することができます。
特に企業環境では、スクリプト署名が必須条件となるケースも多く、「実行できないスクリプト問題」への根本的な対策にもなります。
ポイントまとめ
Set-AuthenticodeSignature
はスクリプトにデジタル署名を付与するコマンド- 自己署名証明書や企業CA発行の証明書を使用
- タイムスタンプを付与すると証明書期限後も有効
Get-AuthenticodeSignature
で検証可能- 改ざん検出・信頼性向上・企業対応に最適!
スクリプト署名は、PowerShellを企業環境で安全に使うための重要なステップです。
自動化スクリプトやツール配布の際にも、署名を付けることで信頼性と安全性が大幅に向上します。
コメント