プロが教えるわが家の防犯対策術!

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には、証明書チェーンがまだ検証されていないエントリが含まれています

と表示されています

なぜこのようなエラーが出るのか、複数署名になるのを防ぐ事はできるのか

もしおわかりになりましたらご指導下さい

お忙しい中ご面倒をおかけ致しますが何卒よろしくお願い申し上げます

A 回答 (3件)

ANo.2で書き忘れていました。


Windowsを使っているなら、zipコマンドをインストールしなくても標準の機能のみでzipファイルの中の一部エントリを消すことは可能です。Androidのapkファイルはzipファイルの一種なので、apkファイルの拡張子をzipに書き換えてください。そのzipファイルをダブルクリックして開き、要らないエントリを消したら、zipファイルの拡張子をapkに戻すだけです。
もっとも、この方法で"Android Debug"署名をきちんと消せるのかどうかは保証しかねます。

ところで、登録者はアプリの内容に手を加えられない、本当の作者は音信不通という状態で、GooglePlayにアプリ登録後に不具合が見つかったりしたらどうするつもりなのでしょうか?

この回答への補足

salsberry様

何度も回答を頂き本当にありがとうございました

「META-INF」フォルダを削除し、再度圧縮する事で無署名のファイルを
作る事ができ、無事GooglePlayに登録する事ができました

salsberry様のおかげで今回非常に勉強になりました

本当に本当にありがとうございました!

補足日時:2013/07/13 15:59
    • good
    • 0
この回答へのお礼

ご忠告ありがとうございます
salsberry様のおっしゃるとおり、不具合が出た場合は当方では対処できないと思います

GooglePlayに登録費をもう支払ってしまっているのでなんとか公開にこぎつけたいと
考えていますがダウンロードしてくださるユーザーに迷惑をかけることのないように
無料での公開にするつもりです

素人がアプリを公開しようなどとおこがましかったですね…

お教えくださったようにZIPに拡張子を変更しましたがどれを消せばよいのかわかりません

jarsigner -verify -verbose -certsで当方が署名する前のAPKを検証いたしますと


sm 8585 Sat Jun 01 10:24:18 JST 2013 res/drawable/icon.png

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
nchors]

sm 476 Sat Jun 01 10:24:18 JST 2013 res/layout/main.xml

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
nchors]

sm 1548 Sat Jun 01 10:24:18 JST 2013 AndroidManifest.xml

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
nchors]

sm 1292 Sat Jun 01 10:24:20 JST 2013 resources.arsc

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
nchors]

sm 4456 Sat Jun 01 10:24:18 JST 2013 classes.dex

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
nchors]

s 401 Sat Jun 01 10:24:18 JST 2013 META-INF/MANIFEST.MF

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
nchors]

454 Sat Jun 01 10:24:18 JST 2013 META-INF/CERT.SF
1203 Sat Jun 01 10:24:18 JST 2013 META-INF/CERT.RSA

s=署名が検証されました
m=エントリがマニフェスト内にリストされます
k=1つ以上の証明書がキーストアで検出されました
i=1つ以上の証明書がアイデンティティ・スコープで検出されました

jarが検証されました。

警告:
このjarには、証明書チェーンがまだ検証されていないエントリが含まれています。


というふうにZIPファイルを展開したら表示されるすべてのファイル名に
署名がついています

なのでどのファイルを削除すれば複数署名を防ぐ事ができるのかわかりません

もしよろしければ何度も申し訳ございませんがご教授下さい
よろしくお願い申しあげます

そして何度も回答を下さる事に心より感謝申し上げます
本当に本当にありがとうございます

お礼日時:2013/07/13 14:32

質問者さん自身はアプリの内容を変更するスキルがなく、問題のアプリはよそから購入したものなのですよね?


だったら、購入先に「未署名のファイルをよこせ」と言えばいいだけのことではないでしょうか。
    • good
    • 0
この回答へのお礼

ご指摘ありがとうございます

一度交渉してみます
購入先には今回の署名の件で問い合わせをしていたのですが
結局解決に至る前に音信不通になってしまいまして…

今回の要望に応えてもらえるかどうかわかりませんが
お願いしてみます

ありがとうございました

お礼日時:2013/07/11 16:46

「質問者さんが署名する前から、そのapkファイルには"Android Debug"で署名されていた」に一票。


質問者さんが署名する前のapkファイルを jarsigner -verify -verbose -certs アプリ名.apk で検証してみてください。
    • good
    • 0
この回答へのお礼

お忙しい中回答いただきありがとうございます!

確かに署名されているようです
これを外すにはどうすればよいのでしょうか?

zipコマンドで

$ zip -d app.apk.debug_signed 'META-INF/*'
deleting: META-INF/MANIFEST.MF
deleting: META-INF/CERT.SF
deleting: META-INF/CERT.RSA

と入れれば署名が消せるらしいのですが「ZIPコマンド」をどのように
入手すればよいのかわかりません

コマンドプロンプトで入力しても当然でしょうが

'zip' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

C:\Documents and Settings\Owner>deleting: META-INF/MANIFEST.MF
'deleting:' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

C:\Documents and Settings\Owner>deleting: META-INF/CERT.SF
'deleting:' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

と表示されます

どうすればすでに署名されているものを削除できるのでしょうか?

何度も申し訳ございませんがおわかりになりましたらご指導下さい

よろしくお願いいたします

お礼日時:2013/07/10 16:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!