2022-04-17 (日)
ダウンロードしたアプリケーションの実行時にWindowsが署名を確認するようになて久しいけど,証明書の取得に年間数万円かかるのはどうにかならないのかな…….
身元を証明するのにお金を払う仕組みに抵抗があってずっと放置してたけど,日本人なら誰でも入手できる強そうな電子証明書あったのを思い出して中身を確認してみる.
マイナンバーカードの電子証明書,keyUsage = digitalSignatureでcriticalフラグ付いてるので用途が限定されているけど,extendedKeyUsage はないっぽい.codeSigningはdigitalSignatureの一部みたいなので,日本の公的個人認証サービスが信頼されていれば,アプリケーション配布時のコード署名として有効なんだろうか.
* マイナンバーカードでexeファイルに署名を追加する
Microsoft Authenticodeの要求を満たしているのかは確認してないけど,とりあえずファイルのプロパティ上では有効な証明書が表示された.発行者は"Japan Agency for Local Authority Information Systems".
最初は,JPKI利用者ソフト入れて,Visual Studio に付いてる SignTool で署名したらよいくらいにしか思ってなかったのだけど,JPKI利用者ソフトはマイナンバーカードの証明書を読み込んだりできるけど,何か便利なAPI提供してくれてるものではないっぽい?
次に,ICカードの読み書きをするOpenSCがJPKIにも対応していて,Windows用のミニポートドライバを提供しているみたいなので入れてみる.signtoolコマンドの/cspと/kcオプションでスマートカードを使えるっぽい.ただ,No private key is available.
と言われてしまう.マイナンバーカードの秘密鍵は読み取り不可なので署名の生成はICカード上で行わないといけないのだけど,方法が分からず諦める.
もっと分かりやすいツールあるだろうと思って探したら,osslsigncodeというのがあった.説明見る限りでは思った動作をしそうな気がする.OpenSC + OpenSSL + osslsigncode という組み合わせで署名できた.
osslsigncode sign -certs jpki.pem -pkcs11module .../opensc-pkcs11.so -pkcs11engine .../engines-1.1/pkcs11.so -key 1:2 -h sha256 -t http://timestamp.digicert.com -in test.exe -out test_signed.exe
署名しようとしたら,User Authentication PIN
が要求されてなんか変だなと思ったら,最初に現れる鍵を使ってしまってるっぽい.-key 1:2
オプションつけて署名用のDigital Signature Key
を使うようにする.タイムスタンプもつけておいたほうが良さそうなので,DigiCertのタイムスタンプサーバを指定.