Apk harus ditandatangani dengan sertifikat yang sama dengan versi sebelumnya

200

Saya telah mengunggah aplikasi saya ke Google Play (saat itu disebut Android Market) beberapa waktu lalu.

Hari ini saya memperbarui aplikasi, tetapi saya telah menghapus keystore sebelumnya dan membuat yang baru.
Saat mengunggah, dikatakan bahwa APK harus ditandatangani dengan sertifikat yang sama dengan versi sebelumnya:

Gagal mengunggah

Anda mengunggah APK yang ditandatangani dengan sertifikat berbeda ke APK Anda sebelumnya. Anda harus menggunakan sertifikat yang sama.

APK Anda yang sudah ada ditandatangani dengan sertifikat dengan sidik jari:
[SHA1: 89: 2F: 11: FE: CE: D6: CC: DF: 65: E7: 76: 3E: DD: A7: 96: 4F: 84: DD: BA: 33]
dan sertifikat yang digunakan untuk menandatangani APK yang Anda unggah memiliki sidik jari:
[SHA1: 20: 26: F4: C1: DF: 0F: 2B: D9: 46: 03: FF: AB: 07: B1: 28: 7B: 9C: 75: 44: CC]

Tetapi saya tidak memiliki sertifikat ini, dan tidak ingin menghapus dan menerbitkan kembali aplikasi, karena memiliki pengguna aktif.

Apa yang bisa saya lakukan untuk menandatangani aplikasi dengan sertifikat baru?

Artem
sumber
26
Saya mengalami masalah yang berbeda: Saya mencoba untuk memutakhirkan aplikasi tetapi membuat saya mengatakan kesalahan ini. Faktanya adalah, saya tidak pernah mengubah keystore !!! Apa yang dapat saya?!?
Mariux
bagaimana Anda memecahkan ??
Elizabeth
@ int_32 bagaimana Anda menyelesaikannya ??
Amit Sharma

Jawaban:

187

Tidak ada. Baca dokumentasinya: Penerbitan Pembaruan di Android Market

Sebelum mengunggah aplikasi yang diperbarui, pastikan Anda telah menambah atribut android: versionCode dan android: versionName dalam elemen file manifes. Juga, nama paket harus sama dan .apk harus ditandatangani dengan kunci pribadi yang sama. Jika nama paket dan sertifikat penandatanganan tidak cocok dengan versi yang ada, Market akan menganggapnya sebagai aplikasi baru dan tidak akan menawarkannya kepada pengguna sebagai pembaruan.

Rubycon
sumber
14
Jawaban yang bagus Saya tidak pernah menyadari bahwa jika kunci hilang maka aplikasi tidak dapat diperbarui. Harus diingat untuk membuat cadangan kunci di tempat yang aman.
Peter Knego
18
Apa yang akan saya lakukan secara normal adalah menyimpan file keystore di svn. Letakkan folder baru bernama kredensial, bersama dengan trunk / tag / cabang, dan simpan file keystore di sana. Juga tambahkan file .txt baru yang menunjukkan file keystore. Keystore sama pentingnya dengan kode sumber . Setelah Anda kehilangan (atau lupa kata sandi) Anda SCREWED ..
Krishnabhadra
42
Mohon JANGAN memeriksa kata sandi keystore Anda (atau kata sandi apa pun dalam hal ini) ke dalam kontrol sumber, seperti yang dikatakan @Krishnabhadra. Pisahkan keystore dan kata sandi, dan kata sandi aman.
Christopher Orr
1
Apa?! Tapi itu hanya memberi tahu saya bahwa kunci saya sudah terlalu tua sehingga saya menghapusnya dan membuat yang baru sekarang saya mengerti !?
2
@ iwayneo Sistem build mungkin memberi tahu Anda bahwa kunci debug Anda terlalu tua, tetapi itu sangat tidak mungkin terjadi dengan kunci rilis , karena Google Play harus menolak kunci yang kedaluwarsa sebelum Oktober 2033 .
Christopher Orr
127

Apakah Anda masuk dengan tombol debug karena kesalahan?

Google Play tidak memungkinkan Anda untuk mempublikasikan aplikasi yang ditandatangani dengan keystore debug Anda. Jika Anda mencoba mengunggah APK seperti itu, Google Play akan gagal dengan pesan "Anda mengunggah APK yang masuk dalam mode debug. Anda harus masuk APK dalam mode rilis."

Namun, jika Anda mencoba mengunggah pembaruan yang ditandatangani dengan keystore debug, Anda tidak akan melihat pesan ini; Google Play akan menampilkan pesan yang ditampilkan dalam pertanyaan, merujuk pada sidik jari SHA1.

Jadi pertama-tama, periksa apakah Anda menandatangani aplikasi dengan kunci debug secara tidak sengaja.


Bagaimana cara saya memeriksa kunci masuk mana yang digunakan?

Kumpulkan informasi dari APK

Anda dapat memeriksa sertifikat mana APK asli dan pembaruan APK ditandatangani dengan menggunakan perintah ini, menggunakan Java keytool:

keytool -list -printcert -jarfile original.apk
keytool -list -printcert -jarfile update.apk

Ini menunjukkan kepada Anda informasi terperinci tentang cara penandatanganan APK, misalnya:

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

Bagian penting yang perlu diperhatikan di sini - untuk setiap APK - adalah nilai sidik jari SHA1 , nilai identitas Pemilik , dan Valid dari / hingga tanggal.


Jika keytoolperintah itu tidak berfungsi ( -jarfileopsi ini membutuhkan Java 7), Anda bisa mendapatkan lebih banyak informasi dasar melalui jarsignerperintah:

jarsigner -verify -verbose:summary -certs original.apk
jarsigner -verify -verbose:summary -certs update.apk

Sayangnya ini tidak menunjukkan sidik jari SHA1, tetapi menunjukkan identitas pemilik X.509, bersama dengan tanggal kedaluwarsa sertifikat. Sebagai contoh:

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]

Anda dapat mengabaikan pesan "CertPath tidak divalidasi", bersama dengan peringatan tentang rantai sertifikat atau cap waktu; mereka tidak relevan dalam hal ini.

Bandingkan nilai Pemilik, SHA1, dan Kadaluwarsa antara APK

  • Jika nilai identitas Pemilik / X.509 adalah CN=Android Debug, O=Android, C=US, maka Anda telah menandatangani APK dengan kunci debug Anda , bukan kunci rilis asli

  • Jika nilai sidik jari SHA1 berbeda antara yang asli dan yang diperbarui APK, maka Anda tidak menggunakan kunci penandatanganan yang sama untuk kedua APK

  • Jika nilai identitas Pemilik / X.509 berbeda, atau tanggal kedaluwarsa sertifikat berbeda antara kedua APK, maka Anda tidak menggunakan kunci penandatanganan yang sama untuk kedua APK

Perhatikan bahwa meskipun nilai Pemilik / X.509 identik antara kedua sertifikat, ini tidak berarti bahwa sertifikat tersebut identik - jika ada hal lain yang tidak cocok - seperti nilai sidik jari - maka sertifikat berbeda.


Cari keystore asli, periksa cadangan

Jika kedua APK memiliki informasi sertifikat yang berbeda, maka Anda harus menemukan keystore asli, yaitu file dengan nilai sidik jari SHA1 pertama yang Google Play (atau keytool) katakan kepada Anda.

Cari melalui semua file keystore yang dapat Anda temukan di komputer Anda, dan dalam cadangan apa pun yang Anda miliki, sampai Anda memilikinya dengan sidik jari SHA1 yang benar:

keytool -list -keystore my-release.keystore

Cukup tekan Enterjika diminta kata sandi - Anda tidak harus memasukkannya jika Anda hanya ingin cepat memeriksa nilai SHA1.


Saya tidak dapat menemukan keystore asli di mana pun

Jika Anda tidak dapat menemukan keystore asli, Anda tidak akan pernah dapat mempublikasikan pembaruan apa pun ke aplikasi khusus ini.

Android menyebutkan ini secara eksplisit di halaman Menandatangani Aplikasi Anda :

Peringatan: Simpan kunci toko dan kunci pribadi Anda di tempat yang aman dan terlindungi, dan pastikan Anda memiliki cadangan yang aman. Jika Anda menerbitkan aplikasi ke Google Play dan kemudian kehilangan kunci yang Anda tandatangani aplikasi Anda, Anda tidak akan dapat mempublikasikan pembaruan untuk aplikasi Anda, karena Anda harus selalu menandatangani semua versi aplikasi Anda dengan kunci yang sama.

Setelah rilis pertama APK, semua rilis berikutnya harus ditandatangani dengan kunci yang sama persis.


Bisakah saya mengekstrak kunci tanda tangan asli dari APK asli?

Tidak, ini tidak mungkin. APK hanya berisi informasi publik, dan bukan informasi kunci pribadi Anda.


Bisakah saya bermigrasi ke kunci penandatanganan baru?

Tidak. Bahkan jika Anda menemukan yang asli, Anda tidak dapat menandatangani APK dengan kunci A, kemudian menandatangani pembaruan berikutnya dengan kedua tombol A dan B, kemudian menandatangani pembaruan berikutnya setelah itu hanya dengan tombol B.

Menandatangani APK (atau file JAR apa pun) dengan beberapa kunci secara teknis dimungkinkan, tetapi Google Play tidak lagi menerima APK dengan banyak tanda tangan.

Mencoba melakukannya akan menghasilkan pesan "APK Anda telah ditandatangani dengan beberapa sertifikat. Harap hanya menandatanganinya dengan satu sertifikat dan mengunggahnya lagi."


Apa yang dapat saya?

Anda harus membuat aplikasi Anda dengan ID aplikasi baru (mis., Ubah dari "com.example.myapp" menjadi "com.example.myapp2") dan buat daftar baru di Google Play.

Mungkin Anda juga harus mengubah kode Anda sehingga orang dapat menginstal aplikasi baru bahkan jika mereka memiliki aplikasi lama diinstal, misalnya Anda perlu memastikan bahwa Anda tidak memiliki penyedia konten yang saling bertentangan.

Anda akan kehilangan basis instalasi yang ada, ulasan, dll., Dan harus menemukan cara untuk membuat pelanggan Anda yang ada menghapus instalasi aplikasi lama dan menginstal versi baru.

Sekali lagi, pastikan Anda memiliki cadangan aman keystore dan kata sandi yang Anda gunakan untuk versi ini.

Christopher Orr
sumber
Saya sudah mencoba perintah yang Anda berikan, untuk memeriksa debug (yang sebenarnya saya cari), tetapi mengembalikan kesalahan bahwa toples berisi tanda tangan yang tidak menyertakan cap waktu. Saya membuat apk saya menggunakan utas ini: stackoverflow.com/questions/16622843/…
CularBytes
@RageCompex Apakah Anda tidak mendapatkan output dan hanya kesalahan? Ketika saya menjalankan perintah itu, saya juga mendapatkan peringatan stempel waktu (bukan kesalahan). Selama Anda mendapatkan output X.509, itu saja yang Anda butuhkan.
Christopher Orr
Ya, saya mendapatkan output X.509, jadi itu bukan masalah saya kira? Bagaimana [CertPath not validated: Path does not chain with any of the trust anchors], bukan masalah eather? Saya memang melihat nama saya CNjadi saya kira saya sudah menandatanganinya dengan benar :)
CularBytes
@RageCompex Ini sudah dijawab di bagian "Periksa kunci tanda tangan yang digunakan".
Christopher Orr
Saya mendapat serangan jantung mini hari ini. Saya menggunakan baris perintah ini untuk mencari tahu Keystore yang tersembunyi. Terima kasih banyak, teman! Anda menyelamatkan saya ... Sungguh: D
Ajeet
11

Tidak ada - Google mengatakannya dengan jelas bahwa aplikasi diidentifikasi oleh kunci yang digunakan untuk menandatanganinya. Akibatnya jika Anda kehilangan kunci, Anda perlu membuat aplikasi baru.

Callback Eugene Mayevski
sumber
1
@sports Mereka melakukan memperingatkan Anda. Perhatikan pesan Peringatan merah besar : developer.android.com/tools/publishing/…
Christopher Orr
2
@sports Dalam hal apa pun, Anda dapat menerbitkan lebih dari satu aplikasi pada akun pengembang yang sama, sehingga Anda tidak perlu membayar lagi.
Christopher Orr
7

Hari ini saya menghadapi masalah yang sama, sayangnya, saya memiliki dua alias di file keystore saya.masukkan deskripsi gambar di sini

Krishan
sumber
7

Saya baru saja mengalami hal ini dari warna biru jernih. Saya benar-benar tidak berpikir saya mengubah apa pun.

Namun, Build => Clean Projectperbaiki.

Dave Hubbard
sumber
1
Hmm, saya sudah menghabiskan 1 minggu, melakukan segala yang mungkin. dan sudah waktunya untuk mengatakan "WTF", tapi itu satu-satunya yang membantu. (Saya juga telah mencoba cache yang tidak valid yang tidak membantu ..) Terima kasih
Upsilon42
1
Ini memperbaiki masalah setelah menjadi gila selama satu jam
Boris Legovic
Terima kasih untuk ini; Ini adalah penyelamat nyata!
Ian Mbae
Saya tidak melihat ini terkait.
Infinite Loops
Terima kasih banyak!. Saya tidak sengaja membuat apk yang ditandatangani dengan file keystore dan kredensial yang berbeda dan mengunggahnya. Tetap mendapatkan kesalahan yang sama bahkan setelah mengunggah apk dengan keystore yang benar. Setelah satu jam membuat rilis baru dengan cache yang tidak valid, studio android dan restart PC, ini akhirnya memperbaikinya.
Arun
5

Di sini saya mendapatkan jawaban untuk pertanyaan itu. Setelah mencari terlalu lama akhirnya saya bisa memecahkan kunci dan kata sandi untuk ini. Saya lupa kunci dan alias saya juga file jks tapi untungnya saya tahu banyak kata sandi apa yang telah saya masukkan ke dalamnya. tetapi menemukan kombinasi yang tepat untuk itu adalah tugas terberat bagi saya.

Solusi - Unduh ini - plugin Keytool IUI versi 2.4.1 masukkan deskripsi gambar di sini

jendela akan muncul sekarang itu menunjukkan nama alias .. jika Anda file jks benar .. klik kanan pada alias dan tekan "lihat rantai sertifikat" .. itu akan menampilkan Kunci SHA1 .. cocokkan kunci ini dengan kunci tha Anda dapatkan saat Anda mengunggah apk di google app store ...

jika cocok maka Anda dengan file jks yang tepat dan alias ..

sekarang beruntung saya punya banyak kata sandi untuk mencocokkan .. masukkan deskripsi gambar di sini

sekarang buka scrren ini letakkan jalur jks yang sama .. dan kata sandi (di antara kata sandi yang Anda miliki) letakkan setiap jalur di "File sertifikat"

jika layar menunjukkan kesalahan maka kata sandi tidak cocok .. jika tidak menunjukkan kesalahan maka itu berarti Anda dengan file jks yang benar. koreksi alias dan kata sandi () sekarang dengan itu Anda dapat mengunggah apk di play store :)

Arun Yadav
sumber
Anda kehilangan kunci pribadi dan Anda dapat mengambilnya dengan cara ini? Jika jawabannya ya, apakah mungkin bagi Anda untuk menautkan tempat untuk mengunduh alat ini? Dan bagaimana cara membuka aplikasi?
LS_
4

Jika Anda memiliki file apk sebelumnya dengan Anda (cadangan) kemudian gunakan jarSigner untuk mengekstrak sertifikat dari apk itu, kemudian gunakan kunci itu atau gunakan keytool untuk mengkloning sertifikat itu, mungkin itu akan membantu ... Tautan yang bermanfaat adalah dokumen jarsigner dan dokumen keytool. .

om252345
sumber
5
"..use jarSigner untuk mengekstrak sertifikat dari apk itu" - Beri tahu kami bagaimana melakukan ini?
Rubycon
14
Itu tidak akan memulihkan kunci pribadi Anda harus masuk apk lagi.
botteaap
Apk harus ditandatangani dengan kunci pribadi yang sama
om252345
3

Saya sangat merekomendasikan Keystore Explorer ( https://keystore-explorer.org/ ) yang memungkinkan Anda mengakses keystore Anda tanpa harus mengunggahnya ke Google Play. Dengan cara ini Anda dapat memecahkan masalah apakah Anda memasukkan kata sandi yang salah.

drdiv
sumber
1

Anda dapat menggunakan fitur baru penandatanganan aplikasi Google play untuk menghasilkan file kunci baru.

Setelah Mei 2017 Google play store menambahkan fitur baru di Play store dan Ini Berita Baik Untuk Pengembang Android. Dari fitur ini, Pengembang dapat memperbarui aplikasi atau Apk mereka yang kehilangan file KeyStore. Anda harus mengaktifkan penandatanganan aplikasi google play di konsol play store.

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

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

Mendongkrak
sumber
0

Saya menghadapi masalah ini baru-baru ini, setelah mencoba berbagai cara untuk masuk seperti mengaktifkan V1 atau V2, masuk dengan mengubah nama alias dan terakhir mengetahui bahwa saya menggunakan file penyimpanan kunci yang salah

pengguna2837615
sumber
0

Kesalahan [konyol] saya adalah saya menggunakan file app-debug.apk alih-alih file app-release.apk. Anda harus memilih "lepaskan" dalam bingkai "Bangun Varian" saat Anda membuat APK yang ditandatangani. File app-release.apk harus berada di bawah folder "app \ release" di root proyek Anda.

M. Marmor
sumber