スクリプト署名

まず、自己認証局をつくり、そこからスクリプト署名用の証明書を発行する。

.NET SDK > makecert -n "CN=自己認証局の証明書" -a sha1 -eku 1.3.6.1.5.5.7.3.3 -r -ss Root -sv root.pvk root.cer
(rsaキーのパスフレーズをきかれるので、入力する)

.NET SDK > makecert -n "CN=自己認証局から発行された証明書" -pe -a sha1 -eku 1.3.6.1.5.5.7.3.3 -ss My -iv root.pvk -ic root.cer
(認証局のrsaキーのパスフレーズをきかれるので、入力する)

自己認証局からこれ以上証明書を発行する必要がなければ、
root.pvkとroot.cerは削除する。(もう証明書を発行することはできなくなる。)

オプション説明

  • n 証明書のDN
  • a ハッシュ関数アルゴリズム
  • eku (Extended Key Usage) 拡張 キー使用法 をOID(Object ID)で指定する。 1.3.6.1.5.5.7.3.3 はコード署名
  • r 自己署名
  • ss Subjectの証明書の保存先ストア
  • sv Subjectの rsa 秘密鍵ファイル(PVKファイル)
  • pe rsa 秘密鍵を証明書と一緒にCSPコンテナに入れる (Possible Export)
  • iv Issuerの rsa 秘密鍵ファイル(PVKファイル)
  • ic Issuerの証明書(CERファイル)

証明書ストア
Root (ルート認証局)
CA (中間認証局)
My (個人)
TrustedPublisher (信頼された発行元)
Disallowed (信頼されない発行元)

次に、certmgrを使って、スクリプト署名用の証明書をエクスポート/インポートする。
なぜこんなことをするかというと、[秘密キーの保護を強力にする] 機能を使って、
秘密鍵で署名を行う度に、ダイアログで確認するように設定するため。
詳細は get-help about_signing

あとは、set-authenticodesignature でスクリプトファイルに署名を行う。

PS > cd cert:
PS > cd CurrentUser\My
PS > $cert = ls
(発行した証明書を$certに)
PS > Set-AuthenticodeSignature $profile $cert
PS > Set-ExecutionPolicy AllSigned

スクリプトを実行するときに、実行してよいかきかれたら、
[常に実行する]を選択すると、スクリプト署名用の証明書が、
TrustedPublisher に登録される。