apkは以前のバージョンと同じ証明書で署名されている必要があります


200

アプリをGoogle Playにアップロードしました(Androidマーケットと呼ばれたとき)。

今日はアプリを更新しましたが、以前のキーストアを削除して新しいキーストアを作成していました。
アップロード時に、APKは前のバージョンと同じ証明書で署名する必要があると表示されます。

アップロードに失敗しました

以前のAPKとは異なる証明書で署名されたAPKをアップロードしました。同じ証明書を使用する必要があります。

既存のAPKは指紋付きの証明書で署名されています:
[SHA1:89:2F:11:FE:CE:D6:CC:DF:65:E7:76:3E:DD:A7:96: 4F:84:DD:BA:33]
と、アップロードしたAPKの署名に使用された証明書にフィンガープリントがあります:
[SHA1:20:26:F4:C1:DF:0F:2B:D9:46: 03:FF:AB:07:B1:28:7B:9C:75:44:CC]

しかし、私はこの証明書を持っていません。また、アクティブなユーザーがいるため、アプリケーションを削除して再公開したくありません。

新しい証明書でアプリに署名するにはどうすればよいですか?


26
別の問題が発生しています。アプリをアップグレードしようとしましたが、このエラーが何度も表示されます。実際、私はキーストアを変更したことがありません!!! 私に何ができる?!?
Mariux

どのように解決しましたか?
エリザベス

@ int_32どうやって解決するの??
Amit Sharma

回答:


187

何もない。ドキュメントを読む:Androidマーケットでアップデートを公開する

更新されたアプリケーションをアップロードする前に、マニフェストファイルの要素のandroid:versionCode属性とandroid:versionName属性を増やしていることを確認してください。また、パッケージ名は同じで、.apkは同じ秘密鍵で署名されている必要があります。パッケージ名と署名証明書が既存のバージョンのものと一致しない場合、Marketはそれを新しいアプリケーションと見なし、アップデートとしてユーザーに提供しません。


14
すばらしい答えです。キーを紛失するとアプリが更新されないことに気づきませんでした。安全な場所にキーをバックアップすることを覚えておく必要があります。
Peter Knego、2011年

18
私が通常行うことは、svnにキーストアファイルを格納することです。credentialという名前の新しいフォルダーを、trunk / tag / branchesとともに配置し、そこにキーストアファイルを保存します。また、キーストアファイルを示す新しい.txtファイルを追加します。キーストアはソースコードと同じくらい重要です。あなたはネジ止めされ、それを失った(またはパスワードを忘れた)したら...
Krishnabhadra

42
してくださいしないでください @Krishnabhadraが言うように、ソースコントロールにキーストアのパスワード(またはそのことについては任意のパスワード)を確認してください。キーストアとパスワードは別々にして、パスワードは安全に保管してください。
Christopher Orr 2014年

1
何?!しかし、それは私のキーが古すぎると私に言っただけなので、私はそれを削除して新しいキーを作成しました!

2
@iwayneoビルドシステムからデバッグキーが古すぎることが通知された可能性がありますが、リリースキーでは2033年10月より前に期限切れになるキーをGoogle Playで拒否する必要があるため、これが発生することはほとんどありません。
Christopher Orr 2015

126

誤ってデバッグキーで署名しましたか?

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で新しいリストを作成する必要があります。

おそらく、ユーザーが古いアプリをインストールしていても新しいアプリをインストールできるようにコードを変更する必要があるかもしれません。たとえば、競合するコンテンツプロバイダーがないことを確認する必要があります。

既存のインストールベースやレビューなどが失われ、既存の顧客が古いアプリをアンインストールして新しいバージョンをインストールする方法を見つける必要があります。

繰り返しますが、このバージョンで使用するキーストアとパスワードの安全なバックアップがあることを確認してください。


(実際に検索していた)デバッグを確認するために、指定したコマンドを試しましたが、jarにタイムスタンプが含まれていない署名が含まれているというエラーが返されます。私はこのスレッドを使用して、私のAPKを作成しました:stackoverflow.com/questions/16622843/...
CularBytes

@RageCompex出力はなく、エラーのみが表示されますか?そのコマンドを実行すると、タイムスタンプ警告(エラーではない)も表示されます。X.509出力が得られる限り、それで十分です。
Christopher Orr、2015

はい、X.509出力を取得しているので、問題はないと思いますか?何について[CertPath not validated: Path does not chain with any of the trust anchors]ではなく、問題のeather?私の名前はにあるCNので、正しく署名したと思います:)
CularBytes

@RageCompexこれは、「使用されている署名キーの確認」セクションですでに回答されています。
Christopher Orr 2015

今日はミニ心臓発作を起こしました。これらのコマンドラインを使用して、非表示のキーストアを見つけました。本当にありがとう!あなたは私を救った...本当に:D
Ajeet

11

何もない-Googleは、アプリケーションが署名に使用されたキーによって識別されることを明確に述べています。したがって、キーを紛失した場合は、新しいアプリケーションを作成する必要があります。


1
@sports彼らあなたに警告します。お知らせ大きな赤い警告メッセージ:developer.android.com/tools/publishing/...
クリストファー・オア

2
@sportsいずれの場合も、同じ開発者アカウントで複数のアプリを公開できるため、再度支払う必要はありません。
Christopher Orr 2014年

7

今日、同じ問題に直面しましたが、残念ながら、キーストアファイルに2つのエイリアスがありました。ここに画像の説明を入力してください


7

私はこれを澄んだ青から発生させました。何も変えなかったと思う。

ただし、Build => Clean Project修正しました。


1
うーん、私は1週間を費やしてきましたが、できる限りのことをしました。そして今こそ「WTF」と言う時ですが、それが助けになった唯一のものです。(私も
役に立たなかった

1
これにより、1時間夢中になった後の問題が修正されました
Boris Legovic

これをありがとう; それは現実の救済者です!
Ian Mbae

これが関連しているとは思いません。
無限ループ

どうもありがとう!。誤って、異なるキーストアファイルと認証情報で署名済みのAPKを生成してアップロードしました。正しいキーストアでapkをアップロードした後でも同じエラーが発生し続けました。キャッシュを無効にして新しいリリースを作成してから1時間後、AndroidスタジオとPCが再起動し、最終的に修正されました。
アルン

5

ここで私はその質問の答えを得ます。あまりにも長く検索した後、ようやく私はこのためのキーとパスワードを解読することができます。鍵とエイリアスもjksファイルも忘れてしまいましたが、幸いにも私が入力したパスワードの束を知っています。しかし、そのための正しい組み合わせを見つけることは、私にとって最も困難な作業でした。

解決策-ダウンロード-Keytool IUIバージョン2.4.1プラグイン ここに画像の説明を入力してください

ウィンドウがポップアップし、エイリアス名が表示されます。jksファイルが正しい場合..エイリアスを右クリックして[証明書チェーンの表示]をクリックします。SHA1キーが表示されます。このキーと取得したキーを一致させます。グーグルアプリストアでAPKをアップロードしている間...

一致する場合は、正しいjksファイルとエイリアスを使用しています。

幸運なことに、一致するパスワードがたくさんあります。 ここに画像の説明を入力してください

次に、このスクリプトに移動します。同じjksパス..とパスワード(お持ちのパスワードの中で)を「証明書ファイル」に任意のパスに配置します

画面にエラーが表示される場合は、パスワードが一致しません。エラーが表示されない場合は、正しいjksファイルを使用していることを意味します。エイリアスとパスワードを修正して、playストアでapkをアップロードできるようになりました:)


秘密鍵を紛失し、この方法でそれを取得できましたか?答えが「はい」の場合、ツールをダウンロードする場所をリンクできますか?そして、どうやってアプリを開くのですか?
LS_

4

you(backup)を含む以前のapkファイルがある場合は、jarSignerを使用してそのapkから証明書を抽出し、そのキーを使用するか、keytoolを使用してその証明書を複製します。役立つリンクとなる可能性があります... jarsigner docskeytool docs


5
「..jarSignerを使用してそのapkから証明書を抽出する」-これを行う方法を教えてください。
Rubycon

14
これは、apkに再度署名する必要がある秘密鍵を回復しません。
botteaap 2011年

APKは同じ秘密鍵で署名する必要があります
om252345

3

キーストアエクスプローラー(https://keystore-explorer.org/)をお勧めします。キーストアエクスプローラーは、Google Playにアップロードすることなくキーストアにアクセスできます。これにより、パスワードを誤って入力したかどうかをトラブルシューティングできます。


1

新しい機能のGoogle Playアプリ署名を使用して、新しいキーファイルを生成できます。

2017年5月以降、Google PlayストアはPlayストアに新機能を追加し、Android開発者にとって朗報です。この機能から、デベロッパーはKeyStoreファイルを紛失したアプリまたはAPKを更新できます。PlayストアコンソールでGoogle Playアプリの署名を有効にする必要があります。

https://support.google.com/googleplay/android-developer/answer/7384423?hl=en

http://www.geekcodehub.com/2018/05/23/keystore-lost-in-android/


0

V1またはV2を有効にするなどのサインイン方法を試し、エイリアス名を変更してサインインした後、最後にこの問題に直面し、最後に間違ったキーストアファイルを使用していることがわかりました


0

私の[ばかげた]間違いは、app-release.apkファイルの代わりにapp-debug.apkファイルを使用したことです。署名済みAPKを生成するときは、「ビルドバリアント」フレームで「リリース」を選択する必要があります。app-release.apkファイルは、プロジェクトルートの「app \ release」フォルダーの下にあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.