ภาพรวม
Android 13 รองรับ APK Signature Scheme v3.1 ซึ่งเป็นการปรับปรุงAPK Signature Scheme v3 ที่มีอยู่ รูปแบบ v3.1 แก้ไขปัญหาที่ทราบบางประการเกี่ยวกับ APK Signature Scheme v3 เกี่ยวกับการหมุน โดยเฉพาะอย่างยิ่ง รูปแบบลายเซ็น v3.1 รองรับการกำหนดเป้าหมายเวอร์ชัน SDK ซึ่งช่วยให้การหมุนเวียนกำหนดเป้าหมายเป็นแพลตฟอร์มรุ่นที่ใหม่กว่าได้
รูปแบบลายเซ็น v3.1 ใช้รหัสบล็อกที่ Android 12 หรือต่ำกว่าไม่รู้จัก ด้วยเหตุนี้ แพลตฟอร์มจึงใช้ลักษณะการทํางานของผู้ลงนามต่อไปนี้
- อุปกรณ์ที่ใช้ Android 13 ขึ้นไปจะใช้ผู้ลงนามแบบหมุนในบล็อก v3.1
- อุปกรณ์ที่ใช้ Android เวอร์ชันเก่าจะไม่สนใจผู้ลงนามที่หมุนเวียนและใช้ผู้ลงนามเดิมในบล็อก v3 แทน
แอปที่ยังไม่ได้หมุนเวียนคีย์ Signing ไม่จำเป็นต้องดำเนินการใดๆ เพิ่มเติม เมื่อใดก็ตามที่แอปเหล่านี้เลือกที่จะหมุนเวียน ระบบจะใช้รูปแบบลายเซ็น v3.1 โดยค่าเริ่มต้น
บล็อกการรับรอง v3.1
บล็อกการรับรอง v3.1 จะมีเนื้อหาเหมือนกับบล็อกการรับรอง v3 แต่จะมีรหัสบล็อกใหม่ ซึ่งลายเซ็นเหล่านี้จะได้รับการยอมรับในอุปกรณ์ที่ใช้ Android 13 ขึ้นไปเท่านั้น ซึ่งช่วยให้แอปหมุนเวียนคีย์ App Signing ได้อย่างปลอดภัยโดยไม่ต้องกังวลเกี่ยวกับ APK เป้าหมายหลายรายการ เนื่องจากสามารถใช้ผู้ลงนามเดิมเพื่อลงนาม APK ในบล็อกการรับรอง v3 และผู้ลงนามที่หมุนเวียนในบล็อกการรับรอง v3.1 นอกจากนี้ ยังช่วยให้แพลตฟอร์มนํารหัสยืนยันที่มีอยู่ทั้งหมดสําหรับบล็อกการรับรอง v3 มาใช้ซ้ำได้เมื่อยืนยันลายเซ็น v3.1
โดยค่าเริ่มต้น ไลบรารี apksig
จะใช้บล็อกการรับรอง v3.1 ทุกครั้งที่มีระบุคีย์ที่เปลี่ยนและลำดับชั้นในการกําหนดค่าการรับรอง หาก minSdkVersion
ของแอปน้อยกว่า Android 13 และมีการใช้คีย์ที่เปลี่ยนใหม่ คุณต้องระบุคีย์ Signing เดิมด้วยเพื่อให้ใช้ลงนาม APK ในบล็อก Signing เวอร์ชัน 3 ได้ ซึ่งคล้ายกับลักษณะการทำงานปัจจุบันที่กำหนดให้ต้องใช้ผู้ลงนามเดิมหาก APK กำหนดเป้าหมายเป็นเวอร์ชันที่เก่ากว่า Android 9
หากต้องการรองรับการกำหนดเป้าหมายการเปลี่ยนคีย์โดยเริ่มจาก SDK เวอร์ชันหนึ่งๆ ไลบรารี apksig
จะแสดง API ใหม่ที่จะช่วยให้คุณกำหนด SDK เวอร์ชันขั้นต่ำสำหรับการหมุนเวียนได้ หากระบุ SDK เวอร์ชันต่ำกว่า Android 13 เป็นเวอร์ชันขั้นต่ำที่รองรับการเปลี่ยนคีย์ ระบบจะใช้บล็อก v3 เดิม บล็อกการรับรอง v3.1 จะใช้ในกรณีที่มีการหมุนเวียนเท่านั้น โดยตั้งค่า SDK เวอร์ชันขั้นต่ำสำหรับการหมุนเวียนเป็น Android 13 ขึ้นไป บล็อกการรับรอง V3 จะมีแอตทริบิวต์ใหม่สำหรับการหมุนเวียนการปกป้องการลบเวอร์ชัน SDK ขั้นต่ำ
APK มี Lineage | ค่าของ rotation-min-sdk-version | บล็อกการรับรอง v3 | บล็อกการรับรอง v3.1 |
---|---|---|---|
ไม่ | ค่าเริ่มต้นหรือค่าใดก็ได้ (แสดงด้วย x ด้านล่าง) | ลงนามโดยผู้ลงนามเดิม กำหนดเป้าหมายเป็น Android 9 ขึ้นไป | ไม่แสดงตัว |
ใช่ | ค่าเริ่มต้น | ลงนามโดยผู้ลงนามเดิม กำหนดเป้าหมายเป็น Android 9 ถึง 12L | ลงนามโดยผู้ลงนามที่เปลี่ยน กำหนดเป้าหมายเป็น Android 13 ขึ้นไป |
ใช่ | x < 33 (Android 13) | ลงนามโดยผู้ลงนามที่เปลี่ยน กำหนดเป้าหมายเป็น Android 9 ขึ้นไป | ไม่แสดงตัว |
ใช่ | x >= 33 (Android 13) | ลงนามโดยผู้ลงนามเดิม กำหนดเป้าหมายเป็น Android 9 - (x-1) | ลงนามโดยผู้ลงนามที่หันหน้าออก กำหนดเป้าหมายเป็น x+ |
ปัญหาเกี่ยวกับการหมุน
ปัญหาต่อไปนี้ซึ่งเกี่ยวข้องกับการหมุนได้รับการแก้ไขแล้วในแพลตฟอร์ม
การแก้ไขใน Android 12
- แพลตฟอร์มจะให้สิทธิ์การรับรองแอปที่ขอก็ต่อเมื่อผู้ลงนามปัจจุบันของแอปใดแอปหนึ่งอยู่ในลำดับการรับรอง หรือเป็นผู้ลงนามปัจจุบันของแอปอีกแอปหนึ่ง ซึ่งจะช่วยป้องกันไม่ให้สิทธิ์การรับรองแก่แอปที่ขอหากแอป 2 แอปดังกล่าวปฏิบัติตามแนวทางปฏิบัติแนะนำสำหรับคีย์การลงนามและเปลี่ยนเป็นคีย์การลงนามอื่น
- ฟีเจอร์การย้อนกลับ APK ของแพลตฟอร์มไม่สามารถย้อนกลับ APK ที่เพิ่งมีการหมุนเวียนคีย์ Signing เว้นแต่ว่าคีย์ก่อนหน้าในลำดับการรับรองจะมีความสามารถในการย้อนกลับ แต่ความสามารถนี้ขัดต่อวัตถุประสงค์ของการหมุนเวียนเนื่องจากอนุญาตให้การอัปเดตแพ็กเกจใหม่ได้รับการรับรองโดยคีย์ Signing ก่อนหน้าและมีการย้อนกลับคีย์ที่เปลี่ยนไป
- APK ที่รับรองด้วยคีย์ที่หมุนเวียนเท่านั้นและอัปเดตในภายหลังด้วย APK ที่รับรองด้วยคีย์เดิมและคีย์ที่หมุนเวียนในสายการสืบทอดจะแสดงเฉพาะคีย์ที่หมุนเวียนในสายการสืบทอดบนอุปกรณ์ที่ใช้ Android 11 ขึ้นไป
การแก้ไขใน Android 11
PackageManager#checkSignatures
ไม่ได้อัปเดตอย่างถูกต้องเพื่อตรวจสอบกุญแจการรับรองเดิมของ 2 แพ็กเกจ ซึ่งทำให้เครื่องมือวัดผลของแอปที่ใช้คีย์การรับรองแบบหมุนเวียนกับ APK ที่ใช้เครื่องมือวัดผลโดยใช้คีย์การรับรองเดิมใช้งานไม่ได้- แพ็กเกจที่อยู่ภายใต้
sharedUserId
จะแชร์ลำดับการรับรอง เมื่อใดก็ตามที่มีการติดตั้งหรืออัปเดตแอปที่มีลำดับการรับรองที่อัปเดตแล้วในsharedUiserId
ลำดับการรับรองของแอปนั้นจะแทนที่ลำดับการรับรองที่แชร์สำหรับsharedUserId
(กล่าวคือ หากลำดับการรับรองของแอปคือ A -> B และมีการอัปเดตแอปในsharedUserId
ที่มีลำดับการรับรอง B -> C ระบบจะแทนที่ลำดับการรับรองของsharedUserId
ด้วย B -> C) ในทำนองเดียวกัน คุณจะอัปเดตความสามารถของผู้ลงนามคนก่อนหน้าในลำดับชั้นไม่ได้ เว้นแต่จะมีการเปลี่ยนลำดับชั้นการลงนาม
การผสานรวม v4
รูปแบบลายเซ็น v4 ใช้การกำหนดค่าการรับรองที่ระบุให้กับ apksigner ในกรณีที่มีการกำหนดค่าการรับรองหลายรายการสำหรับการหมุนเวียน ระบบจะใช้การกำหนดค่าการรับรองที่หมุนเวียนล่าสุด ก่อนเปิดตัว v3.1 นั้น v3 มีเพียงการกำหนดค่าการรับรองแบบหมุนเวียนล่าสุดนี้เท่านั้น ดังนั้น v4 จึงใช้การกำหนดค่านี้ได้ตามที่เป็นอยู่ รูปแบบการรับรองของ v4 จึงรองรับการหมุนเวียนได้เนื่องจากใช้คีย์การรับรองแบบหมุนเวียนใน SigningInfo แม้ว่า SigningInfo เวอร์ชัน 4 จะไม่รวมลำดับการรับรองทั้งหมด แต่ก็สามารถดึงข้อมูลนี้ได้จากบล็อกการรับรองเวอร์ชัน 3 เพื่อให้แพลตฟอร์มเข้าถึงลำดับการรับรองสำหรับการค้นหาลายเซ็นได้ เมื่อใช้ v3.1 เพื่อกำหนดเป้าหมายการเปลี่ยนรุ่นสำหรับ rotation-min-sdk-version ที่ระบุ การกำหนดค่า v3 ทั่วไปจะมีทั้งการกำหนดค่าการรับรองเดิมและการกำหนดค่าการรับรองที่เปลี่ยนรุ่นล่าสุด เราได้สร้างส่วนขยายรูปแบบลายเซ็น v4 ที่มีบล็อกข้อมูลลายเซ็นเพิ่มเติมสําหรับการกําหนดค่าการรับรองแต่ละรายการจากบล็อก v3.1
การตรวจสอบความถูกต้อง
หากต้องการทดสอบการติดตั้งใช้งาน v3.1 ให้เรียกใช้
PkgInstallSignatureVerificationTest.java
การทดสอบ CTS ใน
cts/hostsidetests/appsecurity/src/android/appsecurity/cts/
ดูข้อมูลเพิ่มเติมเกี่ยวกับการทดสอบได้ที่ส่วนการยืนยันใน v3