web-dev-qa-db-ja.com

apkは以前のバージョンと同じ証明書で署名しなければなりません

私はしばらく前に自分のアプリを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]

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

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

180
arts777

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

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

174
Rubycon

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

Google Playでは、デバッグキーストアで署名されたアプリを公開することはできません。そのようなAPKをアップロードしようとすると、Google Playは「デバッグモードで署名されたAPKをアップロードしました。リリースモードでAPKに署名する必要があります」というメッセージで失敗します。

ただし、デバッグキーストアで署名されたpdateをアップロードしようとすると、notこのメッセージが表示されます。 Google Playは、SHA1フィンガープリントを参照して、質問に表示されるメッセージを表示します。

そのため、まず、誤ってデバッグキーでアプリに署名したかどうかを確認します。


どの署名キーが使用されたかを確認するにはどうすればよいですか?

APKから情報を収集します

Java keytoolを使用して、これらのコマンドを使用して、元のAPKと更新APKが署名された証明書を確認できます。

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指紋値、Ownerアイデンティティ値、および有効なfrom/until日付。


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 validated」メッセージは無視できます。この場合は関係ありません。

APK間の所有者、SHA1、および有効期限の値を比較します

  • Owner/X.509ID値がCN=Android Debug, O=Android, C=US、元のリリースキーではなく、デバッグキーでAPKに署名した

  • SHA1指紋値が元のAPKと更新APKで異なる場合、not両方のAPKに同じ署名キーを使用する

  • Owner/X.509ID値が異なる場合、または証明書の有効期限が2つのAPKで異なるため、両方のAPKに同じ署名キーを使用したnot

Owner/X.509の値が2つの証明書間で同一であっても、指紋の値など、他のものが一致しない場合は証明書が同一であることを意味しないことに注意してください。


元のキーストアを検索し、バックアップを確認します

2つのAPKの証明書情報が異なる場合、must元のキーストア、つまりGoogle Play(またはkeytool)から通知された最初のSHA1フィンガープリント値を持つファイルを見つけます。

正しいSHA1フィンガープリントが含まれるキーストアが見つかるまで、コンピューター上にあるすべてのキーストアファイルを検索します。

keytool -list -keystore my-release.keystore

押すだけ Enter パスワードの入力を求められた場合— SHA1値をすばやく確認するだけの場合は、必ずしもパスワードを入力する必要はありません。


元のキーストアがどこにも見つからない

元のキーストアが見つからない場合、neverこの特定のアプリの更新を公開できません。

Androidは、これを アプリケーションの署名 ページで明示的に言及しています。

警告:キーストアと秘密鍵を安全で安全な場所に保管し、それらの安全なバックアップがあることを確認してください。 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で新しいリストを作成する必要があります。

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

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

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

106
Christopher Orr

何もない - グーグルは、アプリケーションはそれを署名するのに使用されたキーによって識別されると明確に言っている。そのため、鍵をなくした場合は、新しいアプリケーションを作成する必要があります。

今日、私は同じ問題に直面していましたが、残念ながら、キーストアファイルに2つのエイリアスがありました。 enter image description here

6
Krishan

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

解決策 - これをダウンロード - Keytool IUIバージョン2.4.1プラグイン enter image description here

jksファイルが正しい場合は、エイリアスを右クリックして[証明書チェーンを表示]をクリックします。SHA1キーが表示されます。 Google App Storeでapkをアップロード中...

それが一致すれば、あなたは正しいjksファイルとエイリアスを持っています..

今ラッキー私は一致するパスワードの束を持っています.. enter image description here

今、このscrrenに行き、同じjksパスを入れてください..そしてパスワード(あなたが持っているパスワードの中で)は "Certificate file"に任意のパスを入れてください

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

4
Arun Yadav

以前のapkファイルがあれば(バックアップ)、jarSignerを使用してそのapkから証明書を抽出し、そのキーを使用するかkeytoolを使用してその証明書を複製します。役立つリンクが jarsigner docs および keytool docs

3
om252345

私はちょうどこれが澄んだ青い外で起こったのです。私は本当に私が何かを変えたとは思わない。

しかし、 'Build'/'Clean Project'で修正されました。

2
Dave Hubbard

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

1
drdiv

私の[愚かな]間違いは、私がapp-release.apkファイルの代わりにapp-debug.apkファイルを使ったことです。署名付きAPKを生成するときには、[Build Variants]フレームで[release]を選択する必要があります。 app-release.apkファイルは、プロジェクトルートの "app\release"フォルダにあります。

0
M. Marmor

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

0
user2837615

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

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

https://support.google.com/googleplay/Android-developer/answer/7384423?hl=ja

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

0
Gibs