Làm cách nào để biết kho khóa nào được sử dụng để ký ứng dụng?


260

Tôi có một ứng dụng được ký và một số tệp kho khóa. Tôi muốn cập nhật ứng dụng, vì vậy tôi cần tìm ra một trong những phím được sử dụng.

Làm cách nào tôi có thể khớp với kho khóa nào đã được sử dụng để ký ban đầu ứng dụng của tôi với các kho khóa khác nhau mà tôi có trên máy của mình?


Tôi không biết bạn có thể tìm thấy nó hay không, nhưng nếu bạn ký ứng dụng với khóa sai, bảng điều khiển dành cho nhà phát triển (nơi bạn xuất bản ứng dụng) sẽ cho bạn biết rằng đó là sai. Bạn có thể thử tất cả.
logcat

Có khóa công khai 'bảng điều khiển dành cho nhà phát triển'> 'Chỉnh sửa hồ sơ'. Tôi có thể sử dụng nó dù sao để giúp bản thân mình?
xliiv

Làm thế nào để tạo lại tập tin kho khóa nếu nó vô tình bị xóa?
Maveň

@ Maveň bạn không thể. Nếu bạn mất kho khóa của bạn, bạn sẽ nướng. Google đã giới thiệu [Ký ứng dụng], nơi họ giữ thông tin ký. [App Ký]: support.google.com/googleplay/android-developer/answer/...
mir

Câu trả lời:


402

Đầu tiên, giải nén APK và giải nén tệp /META-INF/ANDROID_.RSA (tệp này cũng có thể là CERT.RSA, nhưng chỉ nên có một tệp .RSA).

Sau đó ban hành lệnh này:

keytool -printcert -file ANDROID_.RSA

Bạn sẽ nhận được dấu vân tay như thế này:

     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

Sau đó sử dụng lại keytool để in ra tất cả các bí danh của kho khóa ký của bạn:

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

Bạn sẽ nhận được một danh sách các bí danh và dấu vân tay chứng chỉ của họ:

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

Voila! bây giờ chúng ta có thể xác định apk đã được ký với kho khóa này và với bí danh 'android_key'.

Keytool là một phần của Java, vì vậy hãy đảm bảo PATH của bạn có thư mục cài đặt Java trong đó.


1
Cảm ơn vì điều này. Tôi đã thêm một công cụ để làm điều này cho dự án github của tôi. github.com/RichardBronosky/ota-tools/blob/master/
Khăn

Xin chào Tôi không hiểu lệnh này ~ keytool -list -keystore my-sign-key.keystore, what my-sign-key.keystore
Thoman

2
@Thoman my-sign-key.keystore là tên của tệp kho khóa chứa các khóa được sử dụng để ký apk
1800 THÔNG TIN

Cảm ơn rất nhiều vì chuyện này! Ứng dụng của chúng tôi đã được PlayStore ký lại và nó khiến cho việc đăng nhập của Google không thành công. Tôi đã phải tải xuống APK trực tiếp từ PlayStore và tìm SHA1 thực tế để đăng ký nó trong bảng điều khiển Google Cloud.
Alvin Rusli

335

Bạn có thể sử dụng Công cụ quản lý chứng chỉ và khóa của Java 7 keytoolđể kiểm tra chữ ký của kho khóa hoặc APK mà không cần giải nén bất kỳ tệp nào.

Chữ ký của APK

keytool -printcert -jarfile app.apk

Đầu ra sẽ tiết lộ chủ sở hữu / nhà phát hành chữ ký và dấu vân tay MD5, SHA1 và SHA256 của tệp APK app.apk.

(Lưu ý rằng -jarfileđối số đã được giới thiệu trong Java 7; xem tài liệu để biết thêm chi tiết.)

Chữ ký của một kho khóa

keytool -list -v -keystore release.jks

Đầu ra sẽ tiết lộ các bí danh (mục nhập) trong tệp kho khóa release.jks, với dấu vân tay chứng chỉ (MD5, SHA1 và SHA256).

Nếu dấu vân tay SHA1 giữa APK và kho khóa khớp nhau, thì bạn có thể yên tâm rằng ứng dụng đó đã được ký với khóa.


1
@goRGon Bạn có đang sử dụng Java 7 trở lên không?
Paul Lammertsma

2
@goRGon Thật vậy, -jarfileđối số đã được giới thiệu với Java 7. Tôi đã cập nhật câu trả lời.
Paul Lammertsma

41
Đây phải là một câu trả lời được chấp nhận. Không cần giải nén
Jacek Kwiecień

1
Thật kỳ lạ khi Java 1.6 vẫn được vận chuyển theo mặc định trên Mac. Tôi khuyên bạn nên cập nhật lên phiên bản mới hơn.
Paul Lammertsma

2
@RichardBronosky Điều đó thực sự không đúng. Tôi đã là một nhà phát triển Android trong hơn ba năm mà không làm iOS dev. Mặc dù, tôi đồng ý với quan điểm chính của bạn vì những lý do khác nhau. Java 1.6 dường như là phiên bản mở rộng nhất cho đến nay hoặc ít nhất là phổ biến rộng rãi và trong khi giải pháp được chấp nhận hoạt động với cả 1.6 và 1.7, thì phiên bản này sẽ chỉ hoạt động với 1.7, vì vậy tôi không nghĩ đây là câu trả lời được chấp nhận ( chưa!). (Cũng lưu ý rằng câu trả lời được chấp nhận là mẫu 2012, trong khi câu trả lời này là từ tháng 4 năm 2014)
Fran Marzoa

17

Để xây dựng dựa trên câu trả lời của Paul Lammertsma, lệnh này sẽ in tên và chữ ký của tất cả các APK trong thư mục hiện tại (Tôi đang sử dụng sh vì sau này tôi cần chuyển đầu ra sang grep):

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

Đầu ra mẫu:

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

Hoặc nếu bạn chỉ quan tâm đến SHA1:

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

Đầu ra mẫu:

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

Hấp dẫn! Tôi đã sử dụng một cách tiếp cận tương tự trong xác thực trên cửa hàng phân phối được lưu trữ riêng của chúng tôi để thông báo cho người dùng rằng ứng dụng không được ký chính xác. Tôi cũng lưu ý đặc biệt để quan sát xem bí danh chính là "androiddebugkey" để hiển thị một thông báo có từ khác. Tôi nghĩ rằng Google Play thực hiện xác nhận theo nhiều cách giống nhau. Tôi cho rằng bạn đang sử dụng điều này để xác thực APK trên APKMirror?
Paul Lammertsma

@PaulLammertsma Vâng, chúng tôi là.
Artem Russakovskii

11

Cách dễ dàng hơn nhiều để xem chứng chỉ ký:

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

Điều này sẽ chỉ hiển thị DN, vì vậy nếu bạn có hai certs với cùng một DN, bạn có thể phải so sánh bằng dấu vân tay.


DN là gì? Hầu hết tôi có nhiều dòng như thế này: X.509, CN = {tên và họ} [chứng chỉ có giá trị từ {ngày từ} đến {date_to}]
xliiv

DN là viết tắt của 'Tên phân biệt', trong trường hợp của bạn, đó là phần 'CN = {tên và họ}'.
Nikolay Elenkov

6

Có nhiều phần mềm miễn phí để kiểm tra các chứng chỉ và kho lưu trữ khóa như KeyStore Explorer .

Giải nén apk và mở tệp RSA META-INF /?. ? sẽ là CERT hoặc ANDROID hoặc có thể là một cái gì đó khác. Nó sẽ hiển thị tất cả các thông tin liên quan đến apk của bạn.


4

Bạn có thể làm điều này với apksignercông cụ là một phần của SDK Android:

apksigner verify --print-certs my_app.apk

Bạn có thể tìm thấy apksigner trong thư mục công cụ xây dựng. Ví dụ: ~/Library/Android/sdk/build-tools/29.0.1/apksigner

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.