デジタル署名というのはコードサイニングのことでもあり、スマートスクリーン対策またはISMS対応として行うもの。DigiCertやGMOグローバルサインからコードサイニング証明書を買って、signtool.exeでしかるべき暗号化方式を指定してexeやdllなどに安全なものだと記すこと。あるファイルについて、デジタル署名されているかどうかを確認するには、ファイルのプロパティからデジタル署名タブを開いてみるしかなく、大量にファイルがあったとして1個ずつ確認していると日が暮れる。
使うのはPowerShellで、カレントフォルダを移動しておいて、こんなコマンドを打てばよい。
Get-ChildItem -Path . -Include "*.dll","*.exe" -Recurse | Get-AuthenticodeSignature | Select status, Path | Sort -Property status
そうすると、カレントフォルダ配下のdllまたはexeを対象にデジタル署名されているかどうかを出力してくれる。
Validは有効という意味で、デジタル署名されているということ。
NotSignedは、デジタル署名されていないということ。
以下、コマンドの解説。
Get-ChildItem:フォルダ以下のファイルを取得する
-Recurse: 再帰で探索する
Get-AuthenticodeSignature:署名情報を取得する
Select status, Path:アウトプットする項目指定する
Sort -Property status:statusでソートする
PowerShellの特徴は、コマンドレットを使うのが特徴。動詞-名詞の形式がコマンドレット。何する何をということで、直感的にシステム操作をできるから、正にオブジェクト指向となる。
なお、signtool.exeでもデジタル署名されているかどうかはわかるが、このアウトプットが非常に煩雑で、Yes or Noの結果を出すことができなかった。デジタル署名には、誰がどんな署名をしていて有効なのかどうかというものもあるから、しっかり確認したいならこの方法でもよし。
コードサイニング証明書については有料で買うのが常套手段ではなるが、オレオレの自己署名という方法もあるし、一説ではマイクロソフトが個人プログラマ向けに無料でコードサイニングできるというのもある。この手の証明書の期限がどんどん短くなっていて、3年後には47日ごとに更新しなきゃいけなくなるという流れがあることから考えて、やっぱ金出して買うのがよいだろうな。