APKファイルに署名をつけると複数署名になります
APKファイルに署名をつけるためにkeytoolで
jarsigner -verbose -keystore c:\ディレクトリ\証明書名.keystore c:\ディレクトリ\アプリ名.apk o証明書別名
や
jarsigner -keystore 証明書名.keystore -digestalg SHA1 アプリ名.apk 証明書別名
jarsigner -verbose -keystore 証明書名.keystore -storepass パスワード1 -keypass パスワード2 -signedjar アプリ名.apk aアプリ名2.apk 証明書別名
を実行したら
jarsigner:java.lang.SecurityException: invalid SHA1 signature file digest for n ・・・es/layout/main.xml
というエラーが出てうまく署名できませんでした
そこで
jarsigner -sigalg SHA1withRSA -digestalg SHA1 -keystore 証明書名.keystore -verbose アプリ名.apk 証明書別名
で署名をつけるとあの忌々しいメッセージは表示されなくなり
「jarが検証されました」といううれしいメッセージが表示されるようになりました
しかしなぜか二重署名になってしまい、やはりGooglePlayにアプリを
登録する事はできませんでした
jarsigner -verify -verbose -certs アプリ名.apk
で確認すると
当方がつけた署名以外に
X.509, CN=Android Debug, O=Android, C=US
[証明書は11/11/02 3:15から41/10/25 3:15まで有効です]
という署名がついて複数署名になっています
また、
[CertPathが検証されていません: Path does not chain with any of the trust a
ors]
というエラーが署名の箇所に表示され文末には
このjarには、証明書チェーンがまだ検証されていないエントリが含まれています
と表示されています
なぜこのようなエラーが出るのか、複数署名になるのを防ぐ事はできるのか
もしおわかりになりましたらご指導下さい
お忙しい中ご面倒をおかけ致しますが何卒よろしくお願い申し上げます
お礼
遅くなりましたが、回答ありがとうございます。 現状としては検証もとの署名がリトルエンディアンで作成されているため検証が失敗しているようでした。
補足
以下がソースコードです。 (ちょっと長いですが) /* 元データ読み込み */ byte[] data = faccess.fileread(args[0]); /* 署名データ読み込み */ byte[] sign = faccess.fileread(args[1]); /* 証明書 */ String pubcert = args[2]; /* 証明書ファイルストリーム生成 */ FileInputStream fis = new FileInputStream(pubcert); /* 証明書ファクトリオブジェクト生成 */ DataInputStream dis = new DataInputStream(fis); CertificateFactory cf = CertificateFactory.getInstance("X.509"); byte[] bytes = new byte[dis.available()]; dis.readFully(bytes); ByteArrayInputStream bais = new ByteArrayInputStream(bytes); while(bais.available() > 0){ /* 証明書取得 */ Certificate cert = cf.generateCertificate(bais); /* 公開鍵取得 */ PublicKey pubkey = cert.getPublicKey(); /* 署名オブジェクトを生成する */ Signature sig = Signature.getInstance("SHA1withRSA"); /* 公開鍵証明書での検証 */ /* 署名検証準備 */ sig.initVerify(cert); sig.update(data); /* 署名検証 */ boolean result = sig.verify(sign); System.out.println(result); /* Certificateで取得した公開鍵での検証 */ /* 署名検証準備 */ sig.initVerify(pubkey); sig.update(data); /* 署名検証 */ /*boolean*/ result = sig.verify(sign); System.out.println(result); faccess.filereadはファイルからバイトデータを 取得する関数です。 署名方法はRSAで行っています。