2012-05-18

jarファイルにthawteの証明書で署名をする

jarファイルに署名を新規追加する方法、または署名の中の有効期限切れ証明書を更新する方法をまとめておきます。下記方法では大手認証局のうちの一つのthawteの証明書を利用しています。

1. thawteでの証明書を購入して取得する

http://www.jp.thawte.com/dev/index.html
に従い、Code signing certificate for Microsoft Authenticode(Multi-Purpose)を購入、申請、証明書の発行をする。
※Windowsマシン上のIEで証明書の発行(or更新or再発行)を行う。

2. pfxファイルを生成する

http://www.jp.thawte.com/faq/60013.htm
の方法により証明書発行したWindowsマシンのレジストリ上のデータからpfxファイルを生成する。

3. pfxファイルからjksファイルを生成する

次のコマンドにより、pfxからjksファイルを生成する。

$ keytool -importkeystore -srckeystore MY_KEYSTORE_1.pfx -srcstoretype PKCS12 -destkeystore MY_KEYSTORE_2.jks
出力先キーストアのパスワードを入力してください:
新規パスワードを再入力してください:
ソースキーストアのパスワードを入力してください:
別名 XXX-XXX-XXX-XXX-XXX のエントリのインポートに成功しました。
インポートコマンドが完了しました: 1 件のエントリのインポートが成功しました。0 件のエントリのインポートが失敗したか取り消されました
view raw gistfile1.txt hosted with ❤ by GitHub
参考: http://ccl.c-lis.co.jp/modules/d3blog/details.php?bid=48

次のコマンドにより、jks内の証明書の別名(alias)を簡略な名前にする。

$ keytool -changealias -keystore MY_KEYSTORE_2.jks -alias XXX-XXX-XXX-XXX-XXX -destalias MY_ALIAS
view raw gistfile1.txt hosted with ❤ by GitHub
なお、次のコマンドにより、別名を確認できる。

$ keytool -list -keystore MY_KEYSTORE_2.jks
キーストアのタイプ: JKS
キーストアのプロバイダ: SUN
キーストアには 1 エントリが含まれます。
MY_ALIAS, 2010/06/10, PrivateKeyEntry,
証明書のフィンガープリント (MD5): XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
view raw gistfile1.txt hosted with ❤ by GitHub

4. jksファイルでjarファイルに署名をする

次のコマンドにより、jarファイルに署名をする。

$ jarsigner -keystore MY_KEYSTORE_2.jks TARGET.jar MY_ALIAS
view raw gistfile1.txt hosted with ❤ by GitHub

なお、次のコマンドにより、jarの署名を検証できる。

$ jarsigner -verbose -verify -certs TARGET.jar
22501 Thu Dec 02 20:26:46 JST 2010 META-INF/MANIFEST.MF
22534 Thu May 17 22:40:54 JST 2012 META-INF/MY_ALIAS.SF
3731 Thu May 17 22:40:54 JST 2012 META-INF/MY_ALIAS.RSA
...
sm 1012 Thu Dec 02 20:26:46 JST 2010 com/example/a.class
X.509, CN=Example Inc., O=Example Inc., L=Shinjyuku-ku, ST=Tokyo, C=JP
[証明書は 12/05/17 9:00 から 13/05/10 8:59 まで有効です]
X.509, CN=Thawte Code Signing CA - G2, O="Thawte, Inc.", C=US
[証明書は 10/02/08 9:00 から 20/02/08 8:59 まで有効です]
[KeyUsage 拡張機能はコード署名をサポートしていません]
X.509, CN=thawte Primary Root CA, OU="(c) 2006 thawte, Inc. - For authorized use only", OU=Certification Services Division, O="thawte, Inc.", C=US
[証明書は 06/11/17 9:00 から 36/07/17 8:59 まで有効です]
[KeyUsage 拡張機能はコード署名をサポートしていません]
X.509, CN=Example Inc., O=Example Inc., L=Shinjyuku-ku, ST=Tokyo, C=JP
[証明書は 12/04/14 8:59 に失効しました]
X.509, CN=Thawte Code Signing CA, O=Thawte Consulting (Pty) Ltd., C=ZA
[証明書は 03/08/06 9:00 から 13/08/06 8:59 まで有効です]
[KeyUsage 拡張機能はコード署名をサポートしていません]
X.509, EMAILADDRESS=premium-server@thawte.com, CN=Thawte Premium Server CA, OU=Certification Services Division, O=Thawte Consulting cc, L=Cape Town, ST=Western Cape, C=ZA
[証明書は 96/08/01 9:00 から 21/01/01 8:59 まで有効です]
s = 署名が検証されました。
m = エントリがマニフェスト内にリストされます。
k = 1 つ以上の証明書がキーストアで検出されました。
i = 1 つ以上の証明書がアイデンティティスコープで検出されました。
jar が検証されました。
警告:
この jar には、署名者の証明書が期限切れのエントリが含まれています。
view raw gistfile1.txt hosted with ❤ by GitHub
ここで、上記出力例をよく見ると末尾に警告が表示されています。
古い署名がされたjarに新しい署名をする場合、上記コマンドでは古い署名はそのままで、新しい署名がそこに追加されます(二つの署名付きのjarファイルとなる)。

今回、古い署名の警告をどうにかするスマートな解決方法が分からなかったため、署名を追加する前に下記の方法により古い署名を削除ました:
(1) Windowsで古いjarファイルの拡張子をエクスプローラ上でzipにリネーム
(2) zipファイルをエクスプローラで開く
(3) META-INFフォルダ下のXXX.RSAファイルとXXX.SFファイルを削除(XXXは任意の名前)
(4) エクスプローラ上でzip拡張子をjar拡張子にリネーム

以上です。
もっと簡単な手順になってほしいです...

0 件のコメント: