誤ってデバッグキーで署名しましたか?
Google Playでは、デバッグキーストアで署名されたアプリを公開することはできません。このようなAPKをアップロードしようとすると、Google Playは「デバッグモードで署名されたAPKをアップロードしました。リリースモードでAPKに署名する必要があります」というメッセージで失敗します。
ただし、デバッグキーストアで署名された更新をアップロードしようとした場合、このメッセージは表示されません。Google Playは、SHA1フィンガープリントを参照して、質問に示されたメッセージを表示します。
そのため、最初に、誤ってデバッグキーでアプリに署名したかどうかを確認します。
使用された署名キーを確認するにはどうすればよいですか?
APKから情報を収集する
次のコマンドを使用し、Javaを使用して、元のAPKと更新APKが署名された証明書を確認できますkeytool
。
keytool -list -printcert -jarfile original.apk
keytool -list -printcert -jarfile update.apk
これにより、APKの署名方法に関する詳細情報が表示されます。次に例を示します。
Owner: CN=My App, O=My Company, L=Somewhere, C=DE
Issuer: CN=My App, O=My Company, L=Somewhere, C=DE
Serial number: 4790b086
Valid from: Mon Nov 11 15:01:28 GMT 2013 until: Fri Mar 29 16:01:28 BST 2041
Certificate fingerprints:
MD5: A3:2E:67:AF:74:3A:BD:DD:A2:A9:0D:CA:6C:D4:AF:20
SHA1: A6:E7:CE:64:17:45:0F:B4:C7:FC:76:43:90:04:DC:A7:84:EF:33:E9
SHA256: FB:6C:59:9E:B4:58:E3:62:AD:81:42:...:09:FC:BC:FE:E7:40:53:C3:D8:14:4F
Signature algorithm name: SHA256withRSA
Version: 3
ここで注意すべき重要な部分は、APKごとに、SHA1フィンガープリント値、所有者 ID値、および有効開始日/有効期限です。
そのkeytool
コマンドが機能しない場合(-jarfile
オプションにはJava 7が必要です)、次のjarsigner
コマンドでより基本的な情報を取得できます。
jarsigner -verify -verbose:summary -certs original.apk
jarsigner -verify -verbose:summary -certs update.apk
残念ながら、これにはSHA1フィンガープリントは表示されませんが、X.509所有者IDと証明書の有効期限が表示されます。例えば:
sm 4642892 Thu Apr 17 10:57:44 CEST 2014 classes.dex (and 412 more)
X.509, CN=My App, O=My Company, L=Somewhere, C=DE
[certificate is valid from 11/11/13 12:12 to 29/03/41 12:12]
[CertPath not validated: Path does not chain with any of the trust anchors]
証明書チェーンまたはタイムスタンプに関する警告とともに、「CertPath not valided」メッセージを無視できます。この場合は関係ありません。
APK間の所有者、SHA1、および有効期限の値を比較します
場合は所有者 / X.509識別値がありCN=Android Debug, O=Android, C=US
、その後、あなたはあなたとのAPKに署名したデバッグキーではなく、元のリリースキー
SHA1フィンガープリント値が元のAPKと更新APKで異なる場合、両方のAPKに同じ署名鍵を使用していません
場合は所有者 / X.509アイデンティティ値が異なっている、または証明書の有効期限が2つのAPK間で異なる、あなたはなかったではない、両方のAPKに同じ署名キーを使用します
2つの証明書間でOwner / X.509値が同一であっても、証明書が同一であるとは限らないことに注意してください。フィンガープリント値など、一致しないものがある場合、証明書は異なります。
元のキーストアを検索し、バックアップを確認します
2つのAPKの証明書情報が異なる場合は、元のキーストア、つまりGoogle Play(または)が通知した最初のSHA1フィンガープリント値を持つファイルを見つける必要がありkeytool
ます。
正しいSHA1フィンガープリントを持つファイルが見つかるまで、コンピューター上にあるすべてのキーストアファイルを検索します。
keytool -list -keystore my-release.keystore
Enterパスワードの入力を求められたら押すだけです。SHA1の値をすばやく確認したい場合は、必ずしもパスワードを入力する必要はありません。
元のキーストアがどこにも見つからない
元のキーストアが見つからない場合、この特定のアプリの更新を公開することはできません。
Androidは、Signing Your Applicationページでこれについて明示的に言及しています。
警告:キーストアと秘密鍵は安全な場所に保管し、それらの安全なバックアップを確保してください。アプリをGoogle Playに公開してから、アプリの署名に使用した鍵を紛失した場合、アプリのすべてのバージョンに常に同じ鍵で署名する必要があるため、アプリのアップデートを公開することはできません。
APKの最初のリリース後、それ以降のすべてのリリースは、まったく同じ鍵で署名する必要があります。
元のAPKから元の署名鍵を抽出できますか?
いいえ、できません。APKには公開情報のみが含まれ、秘密鍵情報は含まれません。
新しい署名鍵に移行できますか?
いいえ。オリジナルが見つかっても、キーAでAPKに署名してから、キーAとBの両方で次の更新に署名し、その後、キーBのみで次の更新に署名することはできません。
複数のキーでAPK(または任意のJARファイル)に署名することは技術的に可能ですが、Google Playは複数の署名を持つAPKを受け入れなくなりました。
そうしようとすると、「APKは複数の証明書で署名されています。1つの証明書でのみ署名し、もう一度アップロードしてください」というメッセージが表示されます。
私に何ができる?
新しいアプリケーションID(「com.example.myapp」から「com.example.myapp2」に変更するなど)を使用してアプリを構築し、Google Playで新しいリストを作成する必要があります。
おそらく、ユーザーが古いアプリをインストールしていても新しいアプリをインストールできるようにコードを変更する必要があるかもしれません。たとえば、競合するコンテンツプロバイダーがないことを確認する必要があります。
既存のインストールベースやレビューなどが失われ、既存の顧客が古いアプリをアンインストールして新しいバージョンをインストールする方法を見つける必要があります。
繰り返しますが、このバージョンで使用するキーストアとパスワードの安全なバックアップがあることを確認してください。