apk จะต้องลงชื่อด้วยใบรับรองเดียวกันกับรุ่นก่อนหน้า


200

ฉันได้อัปโหลดแอปของฉันไปยัง Google Play (ย้อนกลับไปเมื่อมันถูกเรียกว่า Android Market) เมื่อไม่นานมานี้

วันนี้ฉันอัปเดตแอป แต่ฉันได้ลบที่เก็บคีย์ก่อนหน้านี้และสร้างขึ้นใหม่
เมื่ออัปโหลดจะมีข้อความระบุว่า 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]

แต่ฉันไม่มีใบรับรองนี้และไม่ต้องการลบและเผยแพร่แอปพลิเคชันอีกครั้งเนื่องจากมีผู้ใช้ที่ใช้งานอยู่

ฉันจะทำอย่างไรให้ลงชื่อแอปของฉันด้วยใบรับรองใหม่


26
ฉันมีปัญหาอื่น: ฉันพยายามอัปเกรดแอป แต่มันทำให้ฉันพูดถึงข้อผิดพลาดนี้ ความจริงก็คือฉันไม่เคยเปลี่ยนที่เก็บคีย์ !!! ฉันจะทำยังไงดี?!
Mariux

คุณแก้ไขได้ยังไง ??
Elizabeth

@ int_32 คุณแก้ปัญหาอย่างไร ??
Amit Sharma

คำตอบ:


187

ไม่มีอะไร อ่านเอกสาร: การเผยแพร่อัปเดตใน Android Market

ก่อนที่จะอัปโหลดแอปพลิเคชันที่อัปเดตตรวจสอบให้แน่ใจว่าคุณได้เพิ่มคุณลักษณะ android: versionCode และ android: versionName ในองค์ประกอบของไฟล์รายการ นอกจากนี้ชื่อแพ็กเกจจะต้องเหมือนกันและ. apk ต้องลงชื่อด้วยไพรเวตคีย์เดียวกัน หากชื่อแพคเกจและใบรับรองการลงนามไม่ตรงกับของรุ่นที่มีอยู่ Market จะพิจารณาว่าเป็นแอปพลิเคชันใหม่และจะไม่เสนอให้ผู้ใช้ในการอัปเดต


14
คำตอบที่ดี ฉันไม่เคยรู้เลยว่าถ้ากุญแจหายไปแอพจะไม่สามารถอัพเดท ต้องจำไว้เพื่อสำรองคีย์ในที่ปลอดภัย
Peter Knego

18
สิ่งที่ฉันจะทำตามปกติคือการจัดเก็บไฟล์ที่เก็บคีย์ใน svn วางโฟลเดอร์ใหม่ชื่อหนังสือรับรองพร้อมกับ trunk / แท็ก / สาขาและเก็บไฟล์ที่เก็บคีย์ที่นั่น รวมถึงเพิ่มไฟล์. txt ใหม่ที่ระบุว่าไฟล์ keystore keystore มีความสำคัญเป็นรหัสที่มา เมื่อคุณทำหาย (หรือลืมรหัสผ่าน) คุณจะถูกสกรู ..
Krishnabhadra

42
กรุณาอย่าตรวจสอบรหัสผ่านที่เก็บคีย์ของคุณ (หรือรหัสผ่านใด ๆ สำหรับเรื่องนั้น) ในการควบคุมแหล่งที่มา @Krishnabhadra พูดว่า เก็บที่เก็บคีย์และรหัสผ่านแยกกันและรหัสผ่านจะปลอดภัย
Christopher Orr

1
อะไร?! แต่มันเพิ่งบอกว่ากุญแจของฉันเก่าเกินไปดังนั้นฉันจึงลบมันและสร้างรหัสใหม่ตอนนี้ฉันได้รับมัน!

2
@iwayneo สร้างระบบอาจจะบอกคุณว่าคุณแก้ปัญหาที่สำคัญคือเก่าเกินไป แต่ที่ไม่น่าจะเกิดขึ้นกับการเปิดตัวที่สำคัญตั้งแต่ Google Play ควรปฏิเสธคีย์ที่หมดอายุก่อนตุลาคม 2033
Christopher Orr

126

คุณลงชื่อด้วยรหัส debug โดยไม่ได้ตั้งใจหรือไม่?

Google Play ไม่อนุญาตให้คุณเผยแพร่แอปที่ลงชื่อด้วยที่เก็บคีย์ดีบักของคุณ หากคุณพยายามอัปโหลด APK ดังกล่าว Google Play จะล้มเหลวด้วยข้อความ "คุณอัปโหลด APK ที่ลงชื่อเข้าใช้ในโหมดแก้ไขข้อบกพร่องคุณต้องลงชื่อ APK ของคุณในโหมดเผยแพร่"

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

ดังนั้นก่อนอื่นให้ตรวจสอบว่าคุณได้ลงชื่อแอปด้วยคีย์ดีบั๊กของคุณหรือไม่


ฉันจะตรวจสอบว่าใช้คีย์การเซ็นชื่อได้อย่างไร

รวบรวมข้อมูลจาก APK

คุณสามารถตรวจสอบใบรับรองดั้งเดิมของ APK และอัปเดต APK ที่ลงชื่อด้วยโดยใช้คำสั่งเหล่านี้โดยใช้ Java keytool:

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

ในส่วนที่สำคัญที่จะต้องทราบที่นี่ - สำหรับแต่ละเอพีเค - เป็นSHA1ค่าลายนิ้วมือที่เจ้าของค่าตัวตนและใช้คูปองได้ตั้งแต่ / จนกระทั่งวันที่


หากkeytoolคำสั่งนั้นใช้ไม่ได้ ( -jarfileตัวเลือกต้องการ Java 7) คุณสามารถรับข้อมูลพื้นฐานเพิ่มเติมได้จากjarsignerคำสั่ง:

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

น่าเสียดายที่นี่ไม่แสดงลายนิ้วมือ SHA1 แต่จะแสดงตัวตนของเจ้าของ X.509 พร้อมกับวันหมดอายุใบรับรอง ตัวอย่างเช่น:

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 ไม่ผ่านการตรวจสอบ" พร้อมกับคำเตือนเกี่ยวกับกลุ่มใบรับรองหรือการประทับเวลา ไม่เกี่ยวข้องในกรณีนี้

เปรียบเทียบค่า Owner, SHA1 และ Expiry ระหว่าง APK

  • หากค่าตัวตนของเจ้าของ / X.509คือแสดงCN=Android Debug, O=Android, C=USว่าคุณได้ลงนาม APK ด้วยคีย์ดีบั๊กของคุณไม่ใช่รหัสรีลีสดั้งเดิม

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

  • หากค่าตัวตนของเจ้าของ / X.509นั้นแตกต่างกันหรือวันหมดอายุใบรับรองแตกต่างกันระหว่าง APK ทั้งสองแสดงว่าคุณไม่ได้ใช้รหัสลงนามเดียวกันสำหรับ APK ทั้งสอง

โปรดทราบว่าแม้ว่าค่า Owner / X.509 จะเหมือนกันระหว่างใบรับรองสองใบนี่ไม่ได้หมายความว่าใบรับรองเหมือนกัน - หากมีสิ่งใดที่ไม่ตรงกัน - เช่นค่าลายนิ้วมือ - ใบรับรองนั้นจะแตกต่างกัน


ค้นหาที่เก็บต้นฉบับดั้งเดิมตรวจสอบข้อมูลสำรอง

หาก APK ทั้งสองมีข้อมูลใบรับรองที่แตกต่างกันคุณต้องค้นหาที่เก็บคีย์ดั้งเดิมนั่นคือไฟล์ที่มีค่าลายนิ้วมือ SHA1 แรกที่ Google Play (หรือkeytool) บอกกับคุณ

ค้นหาไฟล์ keystore ทั้งหมดที่คุณสามารถหาได้ในคอมพิวเตอร์ของคุณและในการสำรองข้อมูลใด ๆ ที่คุณมีจนกว่าคุณจะมีไฟล์ที่มีลายนิ้วมือ SHA1 ที่ถูกต้อง:

keytool -list -keystore my-release.keystore

เพียงกดEnterถ้าได้รับพร้อมท์ให้ใส่รหัสผ่านคุณไม่จำเป็นต้องป้อนรหัสผ่านหากคุณต้องการตรวจสอบค่า SHA1 อย่างรวดเร็ว


ฉันหาที่เก็บคีย์ดั้งเดิมไม่พบทุกที่

หากคุณไม่พบที่เก็บคีย์ดั้งเดิมคุณจะไม่สามารถเผยแพร่การอัปเดตใด ๆ ของแอปนี้ได้

Android กล่าวถึงสิ่งนี้อย่างชัดเจนในหน้าลงชื่อแอปพลิเคชันของคุณ :

คำเตือน:เก็บที่เก็บคีย์และคีย์ส่วนตัวของคุณในที่ปลอดภัยและให้แน่ใจว่าคุณมีการสำรองข้อมูลที่ปลอดภัย หากคุณเผยแพร่แอปไปยัง Google Play และทำรหัสที่คุณลงนามในแอปหายไปคุณจะไม่สามารถเผยแพร่การอัปเดตใด ๆ ในแอปของคุณได้เนื่องจากคุณต้องลงชื่อแอปทุกเวอร์ชันด้วยคีย์เดียวกันเสมอ

หลังจากการเปิดตัว APK ครั้งแรกการเผยแพร่ที่ตามมาทั้งหมดจะต้องลงชื่อด้วยรหัสเดียวกัน


ฉันสามารถแยกรหัสการลงชื่อดั้งเดิมจาก APK ต้นฉบับได้หรือไม่

ไม่ได้นี่เป็นไปไม่ได้ APK มีข้อมูลสาธารณะเท่านั้นไม่ใช่ข้อมูลกุญแจส่วนตัวของคุณ


ฉันสามารถย้ายไปยังรหัสลงนามใหม่ได้หรือไม่

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

การลงชื่อ APK (หรือไฟล์ JAR) ด้วยหลายปุ่มนั้นเป็นไปได้ในทางเทคนิคแต่ Google Play ไม่ยอมรับ APK ที่มีลายเซ็นหลายรายการอีกต่อไป

ความพยายามที่จะทำเช่นนั้นจะส่งผลให้ข้อความ "APK ของคุณได้รับการลงนามด้วยใบรับรองหลายใบกรุณาเซ็นชื่อด้วยใบรับรองเดียวแล้วอัปโหลดอีกครั้ง"


ฉันจะทำอย่างไร

คุณจะต้องสร้างแอปของคุณด้วยรหัสแอปพลิเคชันใหม่ (เช่นเปลี่ยนจาก "com.example.myapp" เป็น "com.example.myapp2") และสร้างรายชื่อแบรนด์ใหม่บน Google Play

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

คุณจะสูญเสียฐานการติดตั้งรีวิวและอื่น ๆ และจะต้องหาวิธีในการทำให้ลูกค้าปัจจุบันของคุณถอนการติดตั้งแอปเก่าและติดตั้งเวอร์ชันใหม่

ตรวจสอบให้แน่ใจว่าคุณได้สำรองข้อมูลที่เก็บคีย์และรหัสผ่านที่คุณใช้สำหรับเวอร์ชันนี้อย่างปลอดภัย


ฉันลองคำสั่งที่คุณให้ไว้เพื่อตรวจสอบการดีบัก (ซึ่งฉันกำลังค้นหาจริง ๆ ) แต่มันกลับข้อผิดพลาดที่ jar มีลายเซ็นต์ที่ไม่มีการประทับเวลา ฉันสร้าง apk ของฉันโดยใช้กระทู้นี้: stackoverflow.com/questions/16622843/…
CularBytes

@RageCompex คุณไม่ได้รับผลลัพธ์และมีเพียงข้อผิดพลาดหรือไม่? เมื่อฉันเรียกใช้คำสั่งนั้นฉันยังได้รับคำเตือนเวลาประทับ (ไม่ใช่ข้อผิดพลาด) ตราบใดที่คุณได้รับผลลัพธ์ X.509 นั่นคือทั้งหมดที่คุณต้องการ
Christopher Orr

ใช่ฉันได้รับเอาต์พุต X.509 ดังนั้นจึงไม่ใช่ปัญหาที่ฉันเดา สิ่งที่เกี่ยวกับ[CertPath not validated: Path does not chain with any of the trust anchors]ไม่ eather ปัญหา? ฉันไม่เห็นชื่อของฉันที่CNดังนั้นผมคิดว่าผมได้ลงนามอย่างถูกต้อง :)
CularBytes

@RageCompex นี่มีคำตอบอยู่แล้วในส่วน "ตรวจสอบรหัสลงนามที่ใช้"
Christopher Orr

วันนี้ฉันมีอาการหัวใจวาย ฉันใช้บรรทัดคำสั่งเหล่านี้เพื่อค้นหา Keystore ที่ซ่อนอยู่ ขอบคุณมาก ๆ ! คุณช่วยฉัน ... จริง ๆ : D
Ajeet

11

ไม่มีอะไร - Google กล่าวอย่างชัดเจนว่ามีการระบุแอปพลิเคชันโดยคีย์ที่ใช้ในการเซ็นชื่อ ดังนั้นหากคุณทำกุญแจหายคุณจะต้องสร้างแอปพลิเคชันใหม่


1
@sports พวกเขาทำเตือนคุณ สังเกตเห็นข้อความเตือนสีแดงขนาดใหญ่: developer.android.com/tools/publishing/…
Christopher Orr

2
@sports ไม่ว่าในกรณีใดคุณสามารถเผยแพร่แอปได้มากกว่าหนึ่งแอปในบัญชีนักพัฒนาเดียวกันดังนั้นคุณไม่จำเป็นต้องจ่ายอีก
Christopher Orr

7

วันนี้ฉันประสบปัญหาเดียวกันโชคไม่ดีที่ฉันมีนามแฝงสองตัวในไฟล์ที่เก็บคีย์ของฉันป้อนคำอธิบายรูปภาพที่นี่


7

ฉันเพิ่งเกิดสิ่งนี้ขึ้นมาจากสีฟ้าใส ฉันไม่คิดว่าฉันจะเปลี่ยนแปลงอะไรเลย

อย่างไรก็ตามBuild => Clean Projectแก้ไขมัน


1
อืมฉันใช้เวลา 1 สัปดาห์ทำทุกอย่างเท่าที่จะทำได้ และถึงเวลาที่จะพูดว่า "WTF" แต่มันเป็นสิ่งเดียวที่ช่วยได้ (ฉันได้ลองใช้แคชที่ทำให้เป็นโมฆะซึ่งไม่ได้ช่วย .. ) ขอบคุณ
Upsilon42

1
ปัญหานี้ได้รับการแก้ไขหลังจากบ้าไปหนึ่งชั่วโมง
Boris Legovic

ขอบคุณสำหรับสิ่งนี้; มันเป็นโปรแกรมรักษาชีวิตจริง!
Ian Mbae

ฉันไม่เห็นสิ่งนี้เกี่ยวข้อง
ลูปไม่มีที่สิ้นสุด

ขอบคุณมาก!. ฉันสร้าง apk ที่ลงชื่อแล้วโดยบังเอิญด้วยไฟล์ keystore และข้อมูลรับรองที่แตกต่างกันและอัปโหลด ยังคงได้รับข้อผิดพลาดเดียวกันแม้หลังจากอัปโหลด apk ด้วยที่เก็บคีย์ที่ถูกต้อง หลังจากหนึ่งชั่วโมงในการสร้างรีลีสใหม่ด้วยแคชที่ไม่ถูกต้อง, android studio และพีซีรีสตาร์ทในที่สุดก็ทำการแก้ไข
อรุณ

5

ที่นี่ฉันได้รับคำตอบสำหรับคำถามนั้น หลังจากค้นหานานเกินไปในที่สุดฉันก็จะถอดรหัสคีย์และรหัสผ่านสำหรับสิ่งนี้ ฉันลืมรหัสและนามแฝงของฉันด้วยเช่นกันไฟล์ jks แต่โชคดีที่ฉันรู้รหัสผ่านมากมายที่ฉันใส่ไว้ แต่การหาชุดที่ถูกต้องสำหรับนั่นเป็นงานที่ยากที่สุดสำหรับฉัน

โซลูชัน - ดาวน์โหลดสิ่งนี้ - ปลั๊กอิน Keytool IUI เวอร์ชัน 2.4.1 ป้อนคำอธิบายรูปภาพที่นี่

หน้าต่างจะปรากฏขึ้นตอนนี้มันจะแสดงชื่อนามแฝง .. หากคุณไฟล์ jks ถูกต้อง .. คลิกขวาที่นามแฝงแล้วกด "ดูเชนใบรับรอง" .. จะแสดงคีย์ SHA1 .. จับคู่คีย์นี้กับคีย์ tha ที่คุณได้รับ ในขณะที่คุณกำลังอัปโหลด apk ใน google app store ...

ถ้ามันตรงกันคุณก็อยู่กับไฟล์ jks และ alias ที่ถูกต้อง ..

ตอนนี้โชคดีฉันมีรหัสผ่านมัดให้ตรงกัน .. ป้อนคำอธิบายรูปภาพที่นี่

ตอนนี้ไป scrren นี้ใส่เส้นทาง jks เดียวกัน .. และรหัสผ่าน (ในรหัสผ่านที่คุณมี) ใส่เส้นทางใด ๆ ใน "ไฟล์ใบรับรอง"

หากหน้าจอแสดงข้อผิดพลาดใด ๆ รหัสผ่านไม่ตรงกัน .. หากไม่แสดงข้อผิดพลาดใด ๆ หมายความว่าคุณมีไฟล์ jks ที่ถูกต้อง แก้ไขนามแฝงและรหัสผ่าน () ทันทีที่คุณสามารถอัปโหลด apk ใน play store :)


คุณทำรหัสส่วนตัวหายและคุณสามารถเรียกคืนได้ด้วยวิธีนี้ หากคำตอบคือใช่คุณสามารถเชื่อมโยงตำแหน่งที่จะดาวน์โหลดเครื่องมือได้หรือไม่? และฉันจะเปิดแอพได้อย่างไร
LS_

4

หากคุณมีไฟล์ apk ก่อนหน้านี้กับคุณ (สำรองข้อมูล) ให้ใช้ jarSigner เพื่อแยกใบรับรองจาก apk นั้นจากนั้นใช้คีย์นั้นหรือใช้ keytool เพื่อโคลนใบรับรองนั้นอาจเป็นสิ่งที่จะช่วยให้ ... ลิงค์ที่มีประโยชน์คือjarsigner docsและkeytool docs .


5
"..use jarSigner เพื่อดึงใบรับรองจาก apk นั้น" - บอกให้เราทราบถึงวิธีการทำเช่นนี้?
Rubycon

14
นั่นจะไม่กู้คืนรหัสส่วนตัวที่คุณจะต้องลงชื่อใน apk อีกครั้ง
botteaap

Apk จะต้องลงชื่อด้วยกุญแจส่วนตัวเดียวกัน
om252345

3

ฉันขอแนะนำKeystore Explorer ( https://keystore-explorer.org/ ) ซึ่งให้คุณเข้าถึงที่เก็บคีย์ของคุณโดยไม่ต้องอัปโหลดไปยัง Google Play วิธีนี้คุณสามารถแก้ไขปัญหาว่าคุณป้อนรหัสผ่านไม่ถูกต้อง


1

คุณสามารถใช้ฟีเจอร์ใหม่ที่ลงชื่อเข้าใช้แอป Google Play เพื่อสร้างไฟล์คีย์ใหม่

หลังจากพฤษภาคม 2017 Google play store เพิ่มคุณสมบัติใหม่บน Play store และเป็นข่าวดีสำหรับนักพัฒนา Android จากคุณลักษณะนี้ผู้พัฒนาสามารถอัปเดตแอพหรือ Apk ที่ทำไฟล์ KeyStore สูญหาย คุณต้องเปิดใช้งานแอป Google Play ที่ลงชื่อเข้าใช้คอนโซล Play Store

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

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


0

ฉันประสบปัญหานี้เมื่อเร็ว ๆ นี้หลังจากพยายามลงชื่อเข้าใช้หลายวิธีเช่นเปิดใช้งาน V1 หรือ V2 ลงชื่อเข้าใช้ด้วยการเปลี่ยนชื่อนามแฝงและรู้ว่าฉันใช้ไฟล์ที่เก็บคีย์ผิด


0

ความผิดพลาด [โง่] ของฉันคือฉันใช้ไฟล์ app-debug.apk แทนไฟล์ app-release.apk คุณต้องเลือก "ปล่อย" ในเฟรม "Build Variants" เมื่อคุณสร้าง APK ที่ลงชื่อแล้ว ไฟล์ app-release.apk ควรอยู่ภายใต้โฟลเดอร์ "app \ release" ในรูทโปรเจคของคุณ

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