企業環境で PowerShell スクリプトを運用する場合、デジタル署名の有無はセキュリティ・統制の観点で非常に重要です。
特に以下のようなケースでは、署名対応がほぼ必須になります。
-
実行ポリシーを AllSigned / RemoteSigned にしている
-
情報セキュリティ監査・内部統制(J-SOX 等)がある
-
バッチサーバ・運用サーバで定常実行している
-
スクリプト改ざんリスクを低減したい
本記事では、企業利用を前提にした PowerShell スクリプトのデジタル署名方法を、証明書の考え方から実践手順・運用上の注意点まで網羅的に解説します。

PowerShell の実行ポリシーと署名の関係
まず前提として、PowerShell には Execution Policy(実行ポリシー) があります。
| ポリシー | 内容 |
|---|---|
| Restricted | スクリプト実行不可 |
| RemoteSigned | 外部取得スクリプトのみ署名必須 |
| AllSigned | すべてのスクリプトに署名必須 |
| Unrestricted | 制限なし |
企業環境では RemoteSigned または AllSigned が一般的です。
この設定下では、署名のない ps1 ファイルは実行できません。
デジタル署名で何が保証されるのか
PowerShell のデジタル署名は、次の2点を保証します。
-
改ざんされていないこと(完全性)
-
誰が作成したスクリプトか(真正性)
つまり、
「信頼できる発行元が作成し、その後変更されていない」
ことを PowerShell が検証できるようになります。
使用する証明書の種類(企業向け)
推奨される証明書
| 証明書種別 | 用途 |
|---|---|
| 社内CA発行のコードサイニング証明書 | 最推奨(企業利用) |
| 商用コードサイニング証明書 | 外部配布向け |
| 自己署名証明書 | 検証・個人用途のみ |
⚠ 自己署名証明書は本番運用には非推奨
(各サーバで信頼登録が必要になり管理が煩雑)
コードサイニング証明書の確認方法
まず、署名に使える証明書を確認します。
|
1 |
Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert<code class="whitespace-pre! language-powershell"> |
-
有効期限内
-
「コード署名」用途が含まれている
これらを満たす証明書が表示されれば OK です。
PowerShell スクリプトに署名する手順
① 署名対象スクリプトを用意
例:
|
1 |
C:\scripts\sample.ps1 |
② 証明書を変数に格納
|
1 2 |
$cert = Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert | Select-Object -First 1<code class="whitespace-pre! language-powershell"> |
※ 複数ある場合は Where-Object で発行元やサムプリント指定推奨
③ Set-AuthenticodeSignature で署名
|
1 2 3 |
Set-AuthenticodeSignature ` -FilePath C:\scripts\sample.ps1 ` -Certificate $cert |
成功すると Status : Valid が表示されます。
④ 署名状態の確認
|
1 2 |
Get-AuthenticodeSignature C:\scripts\sample.ps1<code class="whitespace-pre! language-powershell"> |
| Status | 意味 |
|---|---|
| Valid | 正常 |
| NotSigned | 未署名 |
| HashMismatch | 改ざん検知 |
| UnknownError | 証明書問題 |
署名後にやってはいけないこと
署名後にファイルを編集すると署名は無効になります。
❌ NG例
-
1文字でも修正
-
改行追加
-
エンコード変更
変更した場合は 必ず再署名 が必要です。
企業運用でのベストプラクティス
✔ 開発・署名・配布を分離
-
開発者:ps1 作成
-
署名担当:リリース時に署名
-
実行環境:AllSigned で実行
✔ 実行サーバに証明書を信頼登録
-
「信頼された発行元」
-
「信頼されたルート証明機関」
に社内 CA を登録しておく
✔ CI / バッチ化も可能
よくあるエラーと対処
実行できない(署名済みなのに)
-
証明書が信頼されていない
-
実行ポリシーが厳しすぎる
-
有効期限切れ
HashMismatch が出る
-
署名後に編集されている
-
ファイル転送時に文字コードが変わった
実行ポリシーの確認・設定
|
1 2 |
Get-ExecutionPolicy -List<code class="whitespace-pre! language-powershell"> |
一時的に変更する場合(非推奨)
|
1 2 |
Set-ExecutionPolicy RemoteSigned -Scope Process<code class="whitespace-pre! language-powershell"> |
まとめ
PowerShell のデジタル署名は、
企業システムにおけるスクリプト運用の安全性を大きく高める必須要素です。
-
AllSigned 環境では必須
-
社内 CA 証明書の利用が現実的
-
署名後の変更は禁止
-
運用ルール化が重要
「とりあえず動く」から
「監査・統制・セキュリティに耐える運用」へ
一段レベルを上げたい場合、必ず導入しておきましょう。
