2012/09/22

apkファイルの複数署名

作ったAndroidアプリをAndroid Marketにアップする際、apkファイルに署名しておかなくてはならない。
eclipseでやる場合には、メニューから選んでいけば自動的にやってくれるのだが、手動でやることもできる。

$ jarsigner -keystore xxx.keystore abcde.apk alias_name

このあとでzipalignなどするのだが、まあそれはよかろう。
署名されているかどうかも確認できる。

$ jarsigner -verbose -verify -certs abcde.apk
そうすると、こういう出力がずらずら出てくる。
sm      9812 Thu Nov 18 02:09:34 JST 2010 classes.dex
      X.509, CN=xxxxx, OU=yyyyyy, O=zzzzzz, L=ppp, ST=ffffff, C=jp
      [証明書は 09/09/18 0:28 から 37/02/03 0:28 まで有効です]

 
デバッグ中のapkは、たぶん各フォルダのbinに入っているやつだと思う。
これを見てみると、こうなった。
sm     24480 Fri Aug 19 00:15:06 JST 2011 classes.dex
      X.509, CN=Android Debug, O=Android, C=US
      [証明書は 11/12/20 23:53 に失効します]

デバッグ用の署名、というやつだろう。
このデバッグ用の署名があるapkファイルに、自分の署名をするとどうなるだろう?
jarsignerで署名することはできた。
見てみると、こうなった。
sm     24480 Fri Aug 19 00:15:06 JST 2011 classes.dex
      X.509, CN=xxxxx, OU=yyyyy, O=zzzzzz, L=ppp, ST=ffffffffff, C=jp
      [証明書は 09/09/18 0:28 から 37/02/03 0:28 まで有効です]

      X.509, CN=Android Debug, O=Android, C=US
      [証明書は 11/12/20 23:53 に失効します]


複数署名されたのだ。
なんとなく、署名は1つだけだろうと思っていたので、驚いたというほどではないが、へー、と思った。



なんでこんなのを調べたかというと、EjectSDアプリのためだ。
EjectSDアプリは、eclipseからビルドできない。
Android.mkをつくって、Androidプラットフォーム上でビルドさせているのだ。
ビルドさせた後、できたapkファイルに自分の署名をしてAndroid Marketにアップしていた。
していたのだが、なぜか急に署名に失敗するようになったのだ。
さっきまでできていたのに!

jarsigner: jar に署名できません: java.util.zip.ZipException: invalid entry compressed size (expected xxx but got yyy bytes)
確か、こんなのだった。
ネットの説明を見てみると、デバッグ用の署名がついているため、と書かれている。
しかし、上記を見るとできるのがわかるので、他にも原因がありそうだ。
Android.mkの場合、LOCAL_CERTIFICATEで署名の種類を選べる。
platform、shared、test、mediaの4つ。
build/target/product/security以下にある。
見てみるとわかるが、ここにはkeystoreではなく、pkcs#8とx509のPEMファイルがある。
Androidプラットフォームでビルドする場合は、jarsignerではなくてSignApk.jarを使っている。
これの引数は、pkcs#8とX509なのだ。

なら、Android.mkで署名させない方法があるはず、と調べるも、見つからず。
ならばここで自前のkeystoreで署名させてやる、とkeystoreからpkcs#8とX509に変換する方法を試したが、何が悪いのかうまくいかず。。。
あれこれあれこれやって、疲れ果ててもう一度普通にやると、署名できた。
なんじゃそりゃー。

そんなわけで、EjectSDは2重署名なのでした。

sm     10136 Wed Apr 16 08:40:50 JST 2008 classes.dex
      X.509, CN=xxxxx, OU=yyyyy, O=zzzzzz, L=ppp, ST=ffffffffff, C=jp
      [証明書は 09/09/18 0:28 から 37/02/03 0:28 まで有効です]

      X.509, EMAILADDRESS=android@android.com, CN=Android, OU=Android, O=Android
, L=Mountain View, ST=California, C=US
      [証明書は 08/04/16 7:40 から 35/09/02 7:40 まで有効です]
 
困ったことに、自分の署名が同じであっても、Platform側の証明書が変わるとどうしようもない。
早いうちに、自分の署名をPKCS#8とX509に変換できるようにせねば。
いろいろ調べてやったのだけど、SignApkが例外を起こすのよねぇ。。。






1 件のコメント:

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。