Bir uygulamayı imzalamak için hangi anahtar deposunun kullanıldığını nasıl öğrenebilirim?


261

İmzalı bir uygulama ve birkaç anahtar deposu dosyası var. Uygulamayı güncellemek istiyorum, bu yüzden hangi tuşlardan birinin kullanıldığını bulmam gerekiyor.

Uygulamamı orijinal olarak imzalamak için hangi anahtar deposunun kullanıldığını makinemdeki çeşitli anahtar depolarıyla nasıl eşleştirebilirim?


Bilmiyorum veya bulamıyor olmanız hakkında hiçbir fikrim yok, ancak uygulamayı yanlış anahtarla imzalarsanız, geliştirici konsolu (uygulamaları yayınladığınız yer) size bunun yanlış olduğunu söyleyecektir. Hepsini deneyebilirsiniz.
logcat

Bir ortak anahtar 'geliştirici konsolu'> 'Profili Düzenle' vardır. Kendime yardım etmek için bir şekilde kullanabilir miyim?
xliiv

yanlışlıkla silinen anahtar deposu dosyasını nasıl yeniden oluşturabilirim?
Maveň ツ

@ Maveň can't yapamazsın. Anahtar deponuzu kaybederseniz, tost yaparsınız. Google, imzalama bilgilerini sakladıkları [Uygulama İmzalama] uygulamasını başlattı. [Uygulama İmzalama]: support.google.com/googleplay/android-developer/answer/…
mir

Yanıtlar:


403

İlk olarak, APK'yı açın ve /META-INF/ANDROID_.RSA dosyasını çıkarın (bu dosya CERT.RSA da olabilir, ancak yalnızca bir .RSA dosyası olmalıdır).

Sonra şu komutu verin:

keytool -printcert -file ANDROID_.RSA

Bunun gibi sertifika parmak izleri alacaksınız:

     MD5:  B3:4F:BE:07:AA:78:24:DC:CA:92:36:FF:AE:8C:17:DB
     SHA1: 16:59:E7:E3:0C:AA:7A:0D:F2:0D:05:20:12:A8:85:0B:32:C5:4F:68
     Signature algorithm name: SHA1withRSA

Ardından, imzalama anahtar deponuzun tüm diğer adlarını yazdırmak için tuş takımını tekrar kullanın:

keytool -list -keystore my-signing-key.keystore

Bir takma ad listesi ve sertifika parmak izini alacaksınız:

android_key, Jan 23, 2010, PrivateKeyEntry,
Certificate fingerprint (MD5): B3:4F:BE:07:AA:78:24:DC:CA:92:36:FF:AE:8C:17:DB

İşte bu kadar! Artık apk'nin bu anahtar deposuyla ve 'android_key' takma adıyla imzalandığını belirleyebiliriz.

Keytool, Java'nın bir parçasıdır, bu nedenle PATH'nizde Java kurulum dizini olduğundan emin olun.


1
Bunun için teşekkür ederim. Bunu github projeme yapmak için bir araç ekledim. github.com/RichardBronosky/ota-tools/blob/master/…
Bruno Bronosky

Merhaba bu komutu anlamıyorum ~ keytool -list -keystore my-signing-key.keystore, my-signing-key.keystore nedir
Thoman

2
@Thoman my-signing-key.keystore apk imzalamak için kullanılan anahtarları içeren anahtar deposu dosyasının adı
1800 BİLGİ

Bunun için çok teşekkürler! Uygulamamız PlayStore tarafından yeniden imzalandı ve Google girişinin başarısız olmasına neden oldu. APK'yı doğrudan PlayStore'dan indirip Google Cloud konsoluna kaydetmek için gerçek SHA1'i bulmam gerekiyordu.
Alvin Rusli

336

keytoolHerhangi bir dosya çıkarmadan anahtar deposu veya APK imzasını kontrol etmek için Java 7'nin Anahtar ve Sertifika Yönetim Aracını kullanabilirsiniz.

APK imzası

keytool -printcert -jarfile app.apk

Çıktı, APK dosyasının imza sahibini / yayıncısını ve MD5, SHA1 ve SHA256 parmak izlerini gösterecektir app.apk.

( -jarfileArgümanın Java 7'de tanıtıldığını unutmayın ; daha fazla ayrıntı için belgelere bakın.)

Bir anahtar deposunun imzası

keytool -list -v -keystore release.jks

Çıktı release.jks, sertifika deposu dosyasındaki sertifika parmak izleriyle (MD5, SHA1 ve SHA256) diğer adları (girişler) gösterir .

APK ve anahtar deposu arasındaki SHA1 parmak izleri eşleşirse, uygulamanın anahtarla imzalandığından emin olabilirsiniz.


1
@goRGon Java 7 veya üstünü mü kullanıyorsunuz?
Paul Lammertsma

2
@goRGon Gerçekten, -jarfileargüman Java 7 ile tanıtıldı. Cevabı güncelledim.
Paul Lammertsma

41
Bu kabul edilmiş bir cevap olmalı.
Sıkıştırmaya

1
Java 1.6'nın Mac'te varsayılan olarak hala gönderilmesi tuhaf. Daha yeni bir sürüme güncelleme yapmanızı tavsiye ederim.
Paul Lammertsma

2
@RichardBronosky Bu gerçekten doğru değil. İOS geliştirmeden üç yıldan fazla bir süredir Android geliştiricisiyim. Yine de, farklı nedenlerle ana noktanıza katılıyorum. Java 1.6, şimdiye kadarki en geniş sürüm veya en azından yaygın gibi görünüyor ve kabul edilen çözüm hem 1.6 hem de 1.7 ile çalışırken, bu sadece 1.7 ile çalışacak, bu yüzden bunun kabul edilen cevap olması gerektiğini düşünmüyorum ( hala!). (Ayrıca kabul edilen cevabın 2012, form Nisan 2012'den geldiğine dikkat edin)
Fran Marzoa

17

Paul Lammertsma'nın cevabı üzerine inşa etmek için, bu komut geçerli dizindeki tüm APK'ların adlarını ve imzalarını yazdıracaktır (sh kullanıyorum çünkü daha sonra çıktıyı grep'e eklemeliyim):

find . -name "*.apk" -exec echo "APK: {}" \; -exec sh -c 'keytool -printcert -jarfile "{}"' \;

Örnek çıktı:

APK: ./com.google.android.youtube-10.39.54-107954130-minAPI15.apk
Signer #1:

Signature:

Owner: CN=Unknown, OU="Google, Inc", O="Google, Inc", L=Mountain View, ST=CA, C=US
Issuer: CN=Unknown, OU="Google, Inc", O="Google, Inc", L=Mountain View, ST=CA, C=US
Serial number: 4934987e
Valid from: Mon Dec 01 18:07:58 PST 2008 until: Fri Apr 18 19:07:58 PDT 2036
Certificate fingerprints:
         MD5:  D0:46:FC:5D:1F:C3:CD:0E:57:C5:44:40:97:CD:54:49
         SHA1: 24:BB:24:C0:5E:47:E0:AE:FA:68:A5:8A:76:61:79:D9:B6:13:A6:00
         SHA256: 3D:7A:12:23:01:9A:A3:9D:9E:A0:E3:43:6A:B7:C0:89:6B:FB:4F:B6:79:F4:DE:5F:E7:C2:3F:32:6C:8F:99:4A
         Signature algorithm name: MD5withRSA
         Version: 1

APK: ./com.google.android.youtube_10.40.56-108056134_minAPI15_maxAPI22(armeabi-v7a)(480dpi).apk
Signer #1:

Signature:

Owner: CN=Unknown, OU="Google, Inc", O="Google, Inc", L=Mountain View, ST=CA, C=US
Issuer: CN=Unknown, OU="Google, Inc", O="Google, Inc", L=Mountain View, ST=CA, C=US
Serial number: 4934987e
Valid from: Mon Dec 01 18:07:58 PST 2008 until: Fri Apr 18 19:07:58 PDT 2036
Certificate fingerprints:
         MD5:  D0:46:FC:5D:1F:C3:CD:0E:57:C5:44:40:97:CD:54:49
         SHA1: 24:BB:24:C0:5E:47:E0:AE:FA:68:A5:8A:76:61:79:D9:B6:13:A6:00
         SHA256: 3D:7A:12:23:01:9A:A3:9D:9E:A0:E3:43:6A:B7:C0:89:6B:FB:4F:B6:79:F4:DE:5F:E7:C2:3F:32:6C:8F:99:4A
         Signature algorithm name: MD5withRSA
         Version: 1

Veya sadece SHA1'i önemsiyorsanız:

find . -name "*.apk" -exec echo "APK: {}" \; -exec sh -c 'keytool -printcert -jarfile "{}" | grep SHA1' \;

Örnek çıktı:

APK: ./com.google.android.youtube-10.39.54-107954130-minAPI15.apk
         SHA1: 24:BB:24:C0:5E:47:E0:AE:FA:68:A5:8A:76:61:79:D9:B6:13:A6:00
APK: ./com.google.android.youtube_10.40.56-108056134_minAPI15_maxAPI22(armeabi-v7a)(480dpi).apk
         SHA1: 24:BB:24:C0:5E:47:E0:AE:FA:68:A5:8A:76:61:79:D9:B6:13:A6:00

İlginç! Kullanıcıya uygulamanın doğru bir şekilde imzalanmadığını bildirmek için özel olarak barındırılan dağıtım mağazamızdaki bir doğrulamada çok benzer bir yaklaşım kullandım. Ayrıca, anahtar takma adın farklı bir şekilde ifade edilmiş bir mesajı görüntülemek için "androiddebugkey" olup olmadığını gözlemlemek için özel bir not alırım. Bence Google Play de aynı şekilde doğrulama yapıyor. APKMirror'daki APK'ları doğrulamak için bunu kullandığınızı varsayalım?
Paul Lammertsma

@PaulLammertsma Evet, öyleyiz.
Artem Russakovskii

11

İmzalama sertifikasını görüntülemenin çok daha kolay yolu:

jarsigner.exe -verbose -verify -certs myapk.apk

Bu sadece DN'yi gösterecektir, bu nedenle aynı DN'ye sahip iki sertifikaya sahipseniz, parmak iziyle karşılaştırmanız gerekebilir.


DN nedir? Çoğunlukla bunun gibi birçok satır aldım: X.509, CN = {ad ve soyadı} [sertifika {date from} - {date_to}]
xliiv

DN, 'Ayırt Edici Ad' anlamına gelir, sizin durumunuzda 'CN = {ad ve soyadı}' bölümüdür.
Nikolay Elenkov

6

Sertifikaları ve Anahtar Deposu Gezgini gibi anahtar depolarını incelemek için birçok ücretsiz yazılım vardır .

APK'yı açın ve META-INF / ?. RSA dosyasını açın. ? CERT veya ANDROID veya başka bir şey olabilir. Apk'nizle ilişkili tüm bilgileri görüntüler.


4

Bunu apksignerAndroid SDK'nın bir parçası olan araçla yapabilirsiniz :

apksigner verify --print-certs my_app.apk

Apksigner'ı build-tools dizininde bulabilirsiniz. Örneğin: ~/Library/Android/sdk/build-tools/29.0.1/apksigner

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.