ฉันจะหาที่เก็บคีย์ที่ใช้ในการลงชื่อแอพได้อย่างไร


260

ฉันมีแอพที่ลงชื่อและที่เก็บไฟล์หลายไฟล์ ฉันต้องการอัปเดตแอปดังนั้นฉันจึงต้องตรวจสอบว่าใช้หนึ่งในคีย์ใด

ฉันจะจับคู่ keystore ใดที่ใช้ในการเซ็นชื่อแอพของฉันกับที่เก็บคีย์ต่าง ๆ ที่ฉันมีในเครื่องของฉัน


ฉันไม่รู้ว่าคุณจะพบหรือไม่ แต่ถ้าคุณลงชื่อแอปด้วยคีย์ผิดคอนโซลนักพัฒนาซอฟต์แวร์ (ที่คุณเผยแพร่แอพ) จะบอกคุณว่ามันผิด คุณสามารถลองพวกเขาทั้งหมด
logcat

มีคีย์สาธารณะ 'คอนโซลผู้พัฒนา'> 'แก้ไขโปรไฟล์' ฉันสามารถใช้มันเพื่อช่วยตัวเองได้หรือไม่?
xliiv

จะสร้างไฟล์ที่เก็บคีย์ใหม่ได้อย่างไรหากไฟล์นั้นถูกลบโดยไม่ตั้งใจ?
Maveňツ

@ Maveňツคุณทำไม่ได้ ถ้าคุณปล่อยที่เก็บคีย์ของคุณคุณจะปิ้งขนมปัง Google ได้แนะนำ [แอปพลิเคชันการลงชื่อเข้าใช้] ซึ่งเป็นที่เก็บข้อมูลการลงชื่อเข้าใช้ [แอปลงนาม]: support.google.com/googleplay/android-developer/answer/...
mir

คำตอบ:


402

ก่อนอื่นให้เปิดเครื่องรูด APK และแตกไฟล์ /META-INF/ANDROID_.RSA (ไฟล์นี้อาจเป็น CERT.RSA แต่ควรมีไฟล์. RSA เพียงไฟล์เดียวเท่านั้น)

จากนั้นออกคำสั่งนี้:

keytool -printcert -file ANDROID_.RSA

คุณจะได้รับลายนิ้วมือใบรับรองเช่นนี้:

     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

จากนั้นใช้ keytool อีกครั้งเพื่อพิมพ์นามแฝงทั้งหมดของที่เก็บคีย์ของคุณ:

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

คุณจะได้รับรายชื่อแทนและลายนิ้วมือใบรับรอง:

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! ตอนนี้เราสามารถพิจารณาได้ว่า apk ได้รับการลงนามด้วย keystore นี้และด้วยนามแฝง 'android_key'

Keytool เป็นส่วนหนึ่งของ Java ดังนั้นตรวจสอบให้แน่ใจว่า PATH ของคุณมีการติดตั้ง Java ในตัว


1
ขอบคุณสำหรับสิ่งนี้. ฉันเพิ่มเครื่องมือสำหรับทำสิ่งนี้ในโครงการ GitHub ของฉัน github.com/RichardBronosky/ota-tools/blob/master/…
Bruno Bronosky

สวัสดีฉันไม่เข้าใจคำสั่งนี้ ~ keytool -list -keystore my-registration-key.keystore ฉันคืออะไร -inewith-key.keystore
Thoman

2
@Thoman my-registration-key.keystore เป็นชื่อของไฟล์ keystore ที่มีคีย์ที่ใช้ในการลงชื่อ apk
1800 ข้อมูล

ขอบคุณมากสำหรับสิ่งนี้! แอพของเราได้รับการลงนามใหม่โดย PlayStore และทำให้การเข้าสู่ระบบของ Google ล้มเหลว ฉันต้องดาวน์โหลด APK โดยตรงจาก PlayStore และค้นหา SHA1 จริงเพื่อลงทะเบียนในคอนโซล Google Cloud
Alvin Rusli

335

คุณสามารถใช้เครื่องมือการจัดการคีย์และใบรับรองของ Java 7 keytoolเพื่อตรวจสอบลายเซ็นของที่เก็บคีย์หรือ APK โดยไม่ต้องแตกไฟล์ใด ๆ

ลายเซ็นต์ของ APK

keytool -printcert -jarfile app.apk

เอาท์พุทจะเปิดเผยลายเซ็นเจ้าของ / ผู้ออกหลักทรัพย์และ MD5, SHA1 SHA256 app.apkและลายนิ้วมือของไฟล์

(โปรดทราบว่ามีการ-jarfileแนะนำอาร์กิวเมนต์ใน Java 7 ดูเอกสารประกอบสำหรับรายละเอียดเพิ่มเติม)

ลายเซ็นของที่เก็บคีย์

keytool -list -v -keystore release.jks

เอาต์พุตจะเปิดเผยนามแฝง (รายการ) ในไฟล์ที่เก็บคีย์release.jksพร้อมกับลายนิ้วมือใบรับรอง (MD5, SHA1 และ SHA256)

หากลายนิ้วมือ SHA1 ระหว่าง APK และที่เก็บคีย์ตรงกันคุณสามารถมั่นใจได้ว่าแอปนั้นลงชื่อด้วยรหัส


1
@goRGon คุณใช้ Java 7 หรือใหม่กว่าหรือไม่?
พอลแลมเมอร์มา

2
@goRGon แท้จริงแล้ว-jarfileข้อโต้แย้งถูกนำมาใช้กับ Java 7 ฉันได้อัปเดตคำตอบ
พอลแลมเมอร์มา

41
นี่ควรเป็นคำตอบที่ยอมรับได้ ไม่ต้องทำการคลายซิป
Jacek Kwiecień

1
เป็นเรื่องแปลกที่ Java 1.6 ยังคงจัดส่งเป็นค่าเริ่มต้นบน Mac ฉันขอแนะนำให้อัปเดตเป็นเวอร์ชันที่ใหม่กว่า
Paul Lammertsma

2
@RichardBronosky นั่นไม่จริงเลย ฉันเป็นนักพัฒนา Android มานานกว่าสามปีโดยไม่ต้องทำ iOS dev แม้ว่าฉันเห็นด้วยกับประเด็นหลักของคุณด้วยเหตุผลที่แตกต่างกัน Java 1.6 ดูเหมือนจะเป็นเวอร์ชั่นที่ขยายออกไปมากที่สุดหรืออย่างน้อยก็แพร่หลายและในขณะที่โซลูชันที่ได้รับการยอมรับนั้นใช้ได้กับทั้ง 1.6 และ 1.7 แต่อันนี้จะใช้ได้กับ 1.7 เท่านั้นดังนั้นฉันไม่คิดว่านี่ควรเป็นคำตอบที่ยอมรับได้ ยัง!). (โปรดทราบว่าคำตอบที่ยอมรับคือแบบฟอร์ม 2012 ในขณะที่คำตอบนี้มาจากเมษายน 2014)
Fran Marzoa

17

เพื่อสร้างคำตอบของ Paul Lammertsma คำสั่งนี้จะพิมพ์ชื่อและลายเซ็นของ APK ทั้งหมดใน dir ปัจจุบัน (ฉันใช้ sh เพราะในภายหลังฉันต้องไปป์ที่เอาต์พุตเพื่อ grep):

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

ตัวอย่างผลลัพธ์:

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

หรือถ้าคุณสนใจ SHA1:

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

ตัวอย่างผลลัพธ์:

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

! ที่น่าสนใจ ฉันใช้วิธีการที่คล้ายกันมากในการตรวจสอบความถูกต้องในร้านจำหน่ายของเราที่จัดทำโดยเอกชนเพื่อแจ้งให้ผู้ใช้ทราบว่าแอปไม่ได้ลงชื่ออย่างถูกต้อง ฉันยังทราบเป็นพิเศษเพื่อสังเกตว่านามแฝงที่สำคัญคือ "androiddebugkey" เพื่อแสดงข้อความที่แตกต่างกัน worded ฉันคิดว่า Google Play ทำการตรวจสอบในลักษณะเดียวกัน ฉันคิดว่าคุณกำลังใช้สิ่งนี้เพื่อตรวจสอบ APK ใน APKMirror ใช่ไหม
Paul Lammertsma

@PaulLammertsma ใช่เราคือ
Artem Russakovskii

11

วิธีที่ง่ายกว่ามากในการดูใบรับรองการลงนาม:

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

สิ่งนี้จะแสดงเฉพาะ DN ดังนั้นหากคุณมีสอง certs กับ DN เดียวกันคุณอาจต้องเปรียบเทียบด้วยลายนิ้วมือ


DN คืออะไร ส่วนใหญ่ฉันมีหลายบรรทัดเช่นนี้: X.509, CN = {ชื่อและนามสกุล} [ใบรับรองใช้ได้ตั้งแต่ {date จาก} ถึง {date_to}]
xliiv

DN ย่อมาจาก 'Distinguished Name' ในกรณีของคุณคือส่วน 'CN = {ชื่อและนามสกุล}'
Nikolay Elenkov

6

มีหลาย freewares การตรวจสอบใบรับรองและร้านค้าที่สำคัญเช่นKeyStore Explorer ที่

เปิดเครื่องรูด apk และเปิดไฟล์ META-INF / ?. RSA ? จะเป็น CERT หรือ ANDROID หรืออาจเป็นอย่างอื่น มันจะแสดงข้อมูลทั้งหมดที่เกี่ยวข้องกับ apk ของคุณ


4

คุณสามารถทำได้ด้วยapksignerเครื่องมือที่เป็นส่วนหนึ่งของ Android SDK:

apksigner verify --print-certs my_app.apk

คุณสามารถค้นหา apksigner ในไดเรกทอรี build-tools ตัวอย่างเช่น: ~/Library/Android/sdk/build-tools/29.0.1/apksigner

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.