(MVP が伝授するスクリプト作成のヒントとコツにも紹介されました)
最近 PowerShell を書き始めたので、署名をしたいなぁ... と思って AD CS からコード証明書を発行させるようにしました。ドメイン環境であれば AD CS からコード署名証明書を発行できます。(スタンドアローン AD CS ではコード証明の発行はできません)
これを書いた後に気が付いたので、先に補足しておきます。
デフォルトでは、コード証明書の要求権限が Domain Users に無いのと、証明書の有効期限が1年です。Default を変更するには、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.