(MVP が伝授するスクリプト作成のヒントとコツにも紹介されました)
最近 PowerShell を書き始めたので、署名をしたいなぁ... と思って AD CS からコード証明書を発行させるようにしました。ドメイン環境であれば AD CS からコード署名証明書を発行できます。(スタンドアローン AD CS ではコード証明の発行はできません)
AD CS でコード署名のテンプレートを追加します
AD CS で発行する証明書テンプレートの追加

コード署名を指定

コード署名が発行できるようになった

クライアントからは MMC でコード署名証明書を要求します
MMCにスナップインを追加

証明書を追加

ユーザアカウント

証明書を要求

AD登録ポリシー

コード署名を要求

コード署名がセットされた

あれ? UnknownError になるし.... 署名方法何か間違っているのかなぁ.... .NET Framework 2.0 SDK の makecert.exe を使っても同じエラーになるし....
署名に失敗する
PS F:\vhd> $cert=@(Get-ChildItem -Path cert:\CurrentUser\my
-CodeSigningCert)
PS F:\vhd> $cert
ディレクトリ:
Microsoft.PowerShell.Security\Certificate::CurrentUser\my
Thumbprint
Subject
----------
-------
1F7164BC9F1E94D0D6EC4E54B78C86F2E1F80A98
CN=mura, CN=Users, DC=vwnet, DC=jp
PS F:\vhd>
Set-AuthenticodeSignature -Filepath .\vhdboot.ps1 -Cert $cert[0]
ディレクトリ: F:\vhd
SignerCertificate
Status
Path
----------------- ------
----
UnknownError vhdboot.ps1
PS F:\vhd>
色々調べたら、スクリプトファイルに署名する場合は、文字コードが UTF-8 になっていなきゃならないって情報にたどり着きました。文字コードを UTF-8 に変更して無事署名完了 ^^v
文字コードを UTF-8 にしたら署名成功
PS F:\vhd> $cert=@(Get-ChildItem -Path cert:\CurrentUser\my
-CodeSigningCert)
PS F:\vhd> $cert
ディレクトリ:
Microsoft.PowerShell.Security\Certificate::CurrentUser\my
Thumbprint
Subject
----------
-------
1F7164BC9F1E94D0D6EC4E54B78C86F2E1F80A98
CN=mura, CN=Users, DC=vwnet, DC=jp
PS F:\vhd>
Set-AuthenticodeSignature -Filepath .\vhdboot.ps1 -Cert $cert[0]
ディレクトリ: F:\vhd
SignerCertificate
Status
Path
-----------------
------
----
1F7164BC9F1E94D0D6EC4E54B78C86F2E1F80A98 Valid
vhdboot.ps1
おまけです。
PowerShell
はデフォルトでスクリプト実行が禁止(Restricted)になっています。スクリプト実行モードを確認するには「Get-ExecutionPolicy」を使用します。
スクリプトを実行可能にするには、「Set-ExecutionPolicy」でモードを変更します。モード変更をする場合は、PowerShell
を管理者として実行で起動します。
| Restricted | スクリプトの実行を許可しない(default) |
| AllSigned | 署名必須(業務で使うのならこれかな) |
| RemoteSigned | インターネットからダウンロードしたスクリプトには署名が必要 |
| Unrestricted | 署名がなくても実行(ダウンロードスクリプトは実行許可が求められる) |
| Bypass | ブロックも警告もされない(セキュリティ的に危険なので推奨しない) |
| Undefined | 実行ポリシーの削除(GPO設定は削除されない) |
![]()
![]()
Copyright © MURA All rights reserved.