لافتات تصدر للإصدارات

تستخدِم صور نظام التشغيل Android توقيعات مشفَّرة في مكانَين:

  1. يجب توقيع كل ملف .apk داخل الصورة. Android يستخدم "مدير الحزم" توقيع .apk بطريقتين:
    • عند استبدال أحد التطبيقات، يجب أن يتم توقيعه باستخدام المفتاح نفسه المُستخدَم في التطبيق القديم؛ للوصول إلى بيانات التطبيق القديم. يحتفظ هذا سواء بالنسبة إلى تحديث تطبيقات المستخدم من خلال استبدال .apk، أو إلغاء تطبيق نظام تم تثبيت إصدار أحدث منه /data
    • إذا أراد تطبيقان أو أكثر مشاركة رقم تعريف المستخدم (بحيث يمكنهم مشاركة وما إلى ذلك)، يجب توقيعها بنفس المفتاح.
  2. يجب توقيع حزم التحديث عبر الهواء باستخدام أحد المفاتيح التي تتوقعها أو عند رفض عملية التثبيت.

مفاتيح الإصدار

وتشتمل شجرة Android على مفاتيح اختبار ضمن build/target/product/security إنشاء نسخة لنظام التشغيل Android باستخدام make، سيتم توقيع جميع الملفات البالغ عددها .apk باستخدام ومفاتيح الاختبار. بما أنّ مفاتيح الاختبار معروفة بشكل علني، يمكن لأي شخص التوقيع على مفاتيحه الخاصة ملفات .apk تتضمن المفاتيح نفسها، ما قد يسمح لها باستبدال النظام أو الاستيلاء عليه التطبيقات المضمنة في صورة نظام التشغيل لديك. لهذا السبب، من المهم توقيع أي نسخة نظام تشغيل Android تم إصدارها أو نشرها علنًا تضم مجموعة خاصة من مفاتيح الإصدار التي لا يمكن لأحد غيرك الوصول إليها.

لإنشاء مجموعتك الفريدة من مفاتيح الإصدار، شغِّل هذه الأوامر من جذر شجرة Android:

subject='/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'
mkdir ~/.android-certs
for x in releasekey platform shared media networkstack; do \
    ./development/tools/make_key ~/.android-certs/$x "$subject"; \
  done

يجب تغيير $subject ليعكس إعدادات مؤسستك. المعلومات. يمكنك استخدام أي دليل، ولكن احرص على اختيار موقع يتم الاحتفاظ بنسخة احتياطية منه وآمن. يختار بعض المورّدين التشفير مفتاحه الخاص باستخدام عبارة مرور قوية وتخزين المفتاح المشفر في التحكم في المصدر والبعض الآخر يخزّن مفاتيح الإصدار في مكان آخر تمامًا، كما هو الحال على جهاز كمبيوتر به ثغرة هوائية.

لإنشاء صورة إصدار، يُرجى استخدام ما يلي:

make dist
sign_target_files_apks \
-o \    # explained in the next section
--default_key_mappings ~/.android-certs out/dist/*-target_files-*.zip \
signed-target_files.zip

يستخدم النص البرمجي sign_target_files_apks ملفات هدف .zip كإدخال وينتج ملفات مستهدفة جديدة .zip بوصة التي تم توقيع جميع ملفات .apk منها باستخدام مفاتيح جديدة. تم تصميم واجهة يمكن العثور على الصور الموقَّعة تحت IMAGES/ في signed-target_files.zip

توقيع حزم التحديث عبر الهواء

يمكن تحويل ملف ZIP الذي تم توقيعه إلى ملف ZIP الذي تم توقيعه إلى تحديث عبر اتصال لاسلكي موقَّع. باستخدام الإجراء التالي:
ota_from_target_files \
-k  (--package_key) 
signed-target_files.zip \
signed-ota_update.zip

التوقيعات والتثبيت من مصدر غير معروف

لا تتجاوز ميزة التحميل من مصدر غير معروف توقيع حزمة الاسترداد العادية. آلية التحقق هذه—قبل تثبيت إحدى الحزم، سيتحقق الاسترداد من يتم توقيعها باستخدام أحد المفاتيح الخاصة المطابقة للمفاتيح العامة المخزنة في قسم الاسترداد، تمامًا كما هو الحال مع الحزمة التي يتم تسليمها عبر شبكة غير سلكيّة.

عادةً ما يتم التحقق من حزم التحديث المُستلَمة من النظام الرئيسي مرتين: مرة واحدة بواسطة النظام الرئيسي، باستخدام RecoverySystem.verifyPackage() في واجهة برمجة تطبيقات Android ثم مرة أخرى من خلال الاسترداد. تتحقّق واجهة برمجة التطبيقات RecoverySystem API من التوقيع مقابل المفاتيح العامة. في النظام الرئيسي، في الملف /system/etc/security/otacerts.zip (الإعداد التلقائي). تتحقّق عملية الاسترداد من التوقيع مقابل المفاتيح العامة المخزَّنة. في قرص ذاكرة الوصول العشوائي لقسم الاسترداد، في الملف /res/keys.

تحدِّد الملفات المستهدفة .zip التي تم إنشاؤها من خلال الإصدار تلقائيًا شهادة عبر الهواء لمطابقة مفتاح الاختبار. على صورة تم إصدارها، ستظهر حتى تتمكن الأجهزة من التحقق من صحة ملف حزمة التحديث. تمرير علامة -o إلى sign_target_files_apks، كما هو موضح في القسم السابق، يحل محل شهادة مفتاح الاختبار مع شهادة مفتاح الإصدار من شهاداتك الدليل.

عادةً ما تخزن صورة النظام وصورة الاسترداد نفس مجموعة التحديث عبر الهواء والمفاتيح العامة. فمن خلال إضافة مفتاح إلى مجموعة مفاتيح الاسترداد فقط، لا يمكن إمكانية توقيع الحزم التي لا يمكن تثبيتها إلا من خلال التثبيت من مصدر غير معروف (بافتراض أن آلية تنزيل تحديث النظام الرئيسي تعمل بشكل صحيح التحقق من البيانات ضد otacerts.zip). يمكنك تحديد المفاتيح الإضافية لتكون مضمّنة في عملية الاسترداد فقط من خلال ضبط PRODUCT_EXTRA_RECOVERY_KEYS. المتغير في تعريف منتجك:

vendor/yoyodyne/tardis/products/tardis.mk
 [...]

PRODUCT_EXTRA_RECOVERY_KEYS := vendor/yoyodyne/security/tardis/sideload

يشمل ذلك المفتاح العام. vendor/yoyodyne/security/tardis/sideload.x509.pem في الاسترداد بحيث يمكن تثبيت الحزم الموقعة معها. لا يتم تضمين المفتاح الإضافي في otacerts.zip، لذلك التي تتحقق من الحزم التي تم تنزيلها بشكل صحيح لا تستدعي الاسترداد الحزم الموقعة باستخدام هذا المفتاح.

الشهادات والمفاتيح الخاصة

يأتي كل مفتاح في ملفين: الشهادة، التي تحتوي على بالامتداد x509 .pem.والمفتاح الخاص الذي يضم الامتداد .pk8. يجب الاحتفاظ بسرية المفتاح الخاص وضرورة توقيع حزمة. المفتاح نفسه محميًا بكلمة مرور. الشهادة، في ويحتوي على النصف العام فقط من المفتاح، لذا يمكن توزيعه على نطاق واسع. يُستخدم للتحقق من توقيع الحزمة من قبل الخاص.

يستخدم إصدار Android العادي خمسة مفاتيح، تتوفّر جميع هذه المفاتيح في build/target/product/security:

مفتاح تجريبي
مفتاح تلقائي عام للحزم التي لا تحدد مفتاحًا.
نظام
اختبار المفتاح للحزم التي تشكِّل جزءًا من المنصة الأساسية
تمت المشاركة
اختبار المفتاح للعناصر التي تتم مشاركتها في عملية المنزل/جهات الاتصال:
وسائط
اختبار المفتاح للحزم التي تشكل جزءًا من نظام الوسائط/التنزيل
مجموعة الشبكات
اختبار المفتاح للحزم التي تشكل جزءًا من نظام الشبكات. تشير رسالة الأشكال البيانية يُستخدم مفتاح Networkstack لتوقيع البرامج الثنائية المصممة مكوّنات النظام المعيارية . في حال تضمين تحديثات الوحدات بشكل منفصل ودمجها كعناصر مضمَّنة مسبقًا في صورة جهازك، قد لا تحتاج إلى إنشاء مفتاح شبكات في شجرة مصادر Android

تحدد الحزم الفردية أحد هذه المفاتيح عن طريق تعيين LOCAL_CERTIFICATE في ملف Android.mk. (يُستخدم مفتاح الاختبار إذا لم يتم ضبط هذا المتغير.) إِنْتَ أيضًا تحديد مفتاح مختلف تمامًا حسب اسم المسار، على سبيل المثال:

device/yoyodyne/apps/SpecialApp/Android.mk
 [...]

LOCAL_CERTIFICATE := device/yoyodyne/security/special

يستخدم الإصدار الآن مفتاح device/yoyodyne/security/special.{x509.pem,pk8} لتوقيع SpecialApp.apk. لا يمكن أن يستخدم الإصدار سوى المفاتيح الخاصة التي ليست محمية بكلمة مرور.

خيارات التوقيع المتقدمة

استبدال مفتاح توقيع حزمة APK

يعمل النص البرمجي للتوقيع sign_target_files_apks على الهدف. الملفات التي تم إنشاؤها للإصدار. وجميع المعلومات المتعلقة بالشهادات يتم تضمين المفاتيح المستخدمة في وقت الإصدار في الملفات المستهدفة. عند تشغيل نص التوقيع للتوقيع على الإصدار، ويمكن استبدال مفاتيح التوقيع بناءً على المفتاح أو اسم حزمة APK.

استخدام --key_mapping و--default_key_mappings علامات لتحديد بديل المفتاح بناءً على أسماء المفاتيح:

  • العلامة --key_mapping src_key=dest_key تحدد بديل مفتاح واحد في كل مرة.
  • تحدّد العلامة --default_key_mappings dir الدليل بخمسة مفاتيح لاستبدال جميع المفاتيح في build/target/product/security؛ ويكافئ استخدام --key_mapping خمس مرات لتحديد عمليات الربط.
build/target/product/security/testkey      = dir/releasekey
build/target/product/security/platform     = dir/platform
build/target/product/security/shared       = dir/shared
build/target/product/security/media        = dir/media
build/target/product/security/networkstack = dir/networkstack

يمكنك استخدام علم واحد (--extra_apks apk_name1,apk_name2,...=key) لتحديد بدائل مفاتيح التوقيع بناءً على أسماء حِزم APK. في حال حذف إذا تم ترك key فارغًا، يتعامل النص البرمجي مع حِزم APK المحدّدة. كما هو مُوقع مسبقًا.

بالنسبة إلى منتج tardis الافتراضي، ستحتاج إلى ستة مفاتيح محمية بكلمة مرور: خمسة بدلاً من الخمسة في build/target/product/security، وواحد لاستبدال المفتاح الإضافي device/yoyodyne/security/special مطلوب من SpecialApp في المثال أعلاه. إذا كانت المفاتيح في ما يلي الملفات:

vendor/yoyodyne/security/tardis/releasekey.x509.pem
vendor/yoyodyne/security/tardis/releasekey.pk8
vendor/yoyodyne/security/tardis/platform.x509.pem
vendor/yoyodyne/security/tardis/platform.pk8
vendor/yoyodyne/security/tardis/shared.x509.pem
vendor/yoyodyne/security/tardis/shared.pk8
vendor/yoyodyne/security/tardis/media.x509.pem
vendor/yoyodyne/security/tardis/media.pk8
vendor/yoyodyne/security/tardis/networkstack.x509.pem
vendor/yoyodyne/security/tardis/networkstack.pk8
vendor/yoyodyne/security/special.x509.pem
vendor/yoyodyne/security/special.pk8           # NOT password protected
vendor/yoyodyne/security/special-release.x509.pem
vendor/yoyodyne/security/special-release.pk8   # password protected

يجب بعد ذلك توقيع جميع التطبيقات على النحو التالي:

./build/make/tools/releasetools/sign_target_files_apks \
    --default_key_mappings vendor/yoyodyne/security/tardis \
    --key_mapping vendor/yoyodyne/security/special=vendor/yoyodyne/security/special-release \
    --extra_apks PresignedApp= \
    -o tardis-target_files.zip \
    signed-tardis-target_files.zip

ويسبّب ذلك ما يلي:

Enter password for vendor/yoyodyne/security/special-release key>
Enter password for vendor/yoyodyne/security/tardis/networkstack key>
Enter password for vendor/yoyodyne/security/tardis/media key>
Enter password for vendor/yoyodyne/security/tardis/platform key>
Enter password for vendor/yoyodyne/security/tardis/releasekey key>
Enter password for vendor/yoyodyne/security/tardis/shared key>
    signing: Phone.apk (vendor/yoyodyne/security/tardis/platform)
    signing: Camera.apk (vendor/yoyodyne/security/tardis/media)
    signing: NetworkStack.apk (vendor/yoyodyne/security/tardis/networkstack)
    signing: Special.apk (vendor/yoyodyne/security/special-release)
    signing: Email.apk (vendor/yoyodyne/security/tardis/releasekey)
        [...]
    signing: ContactsProvider.apk (vendor/yoyodyne/security/tardis/shared)
    signing: Launcher.apk (vendor/yoyodyne/security/tardis/shared)
NOT signing: PresignedApp.apk
        (skipped due to special cert string)
rewriting SYSTEM/build.prop:
  replace:  ro.build.description=tardis-user Eclair ERC91 15449 test-keys
     with:  ro.build.description=tardis-user Eclair ERC91 15449 release-keys
  replace: ro.build.fingerprint=generic/tardis/tardis/tardis:Eclair/ERC91/15449:user/test-keys
     with: ro.build.fingerprint=generic/tardis/tardis/tardis:Eclair/ERC91/15449:user/release-keys
    signing: framework-res.apk (vendor/yoyodyne/security/tardis/platform)
rewriting RECOVERY/RAMDISK/default.prop:
  replace:  ro.build.description=tardis-user Eclair ERC91 15449 test-keys
     with:  ro.build.description=tardis-user Eclair ERC91 15449 release-keys
  replace: ro.build.fingerprint=generic/tardis/tardis/tardis:Eclair/ERC91/15449:user/test-keys
     with: ro.build.fingerprint=generic/tardis/tardis/tardis:Eclair/ERC91/15449:user/release-keys
using:
    vendor/yoyodyne/security/tardis/releasekey.x509.pem
for OTA package verification
done.

بعد مطالبة المستخدم بكلمات المرور لجميع المفاتيح المحمية بكلمة مرور، يعيد النص البرمجي توقيع جميع ملفات APK في هدف الإدخال .zip باستخدام مفاتيح الإصدار. قبل تشغيل الأمر، يمكنك أيضًا تعيين متغير بيئة ANDROID_PW_FILE إلى اسم ملف مؤقت؛ الـ النص البرمجي، ثم يستدعي المحرر للسماح لك بإدخال كلمات المرور لجميع المفاتيح (قد تكون هذه الطريقة أكثر ملاءمة لإدخال كلمات المرور).

استبدال مفتاح توقيع APEX

يقدّم Android 10 تنسيق ملف APEX للتثبيت وحدات النظام ذات المستوى الأدنى. كما هو موضّح في توقيع APEX، يتم التعامل مع كل ملف APEX باستخدام مفتاحين: أحدهما لصورة نظام الملفات المصغَّرة داخل ملف APEX والبعض الآخر على مستوى APEX بأكمله.

عند التوقيع على الإصدار، يتم استبدال مفتاحَي التوقيع لملف APEX. مع مفاتيح الإصدار. يتم تحديد مفتاح حمولة بيانات نظام الملفات من خلال علامة --extra_apex_payload ومفتاح توقيع ملف APEX بالكامل هو محددة بعلامة --extra_apks.

بالنسبة إلى منتج tardis، لنفترض أنّ لديك إعدادات المفتاح التالية لـ com.android.conscrypt.apex، com.android.media.apex و com.android.runtime.release.apex ملف APEX

name="com.android.conscrypt.apex" public_key="PRESIGNED" private_key="PRESIGNED" container_certificate="PRESIGNED" container_private_key="PRESIGNED"
name="com.android.media.apex" public_key="PRESIGNED" private_key="PRESIGNED" container_certificate="PRESIGNED" container_private_key="PRESIGNED"
name="com.android.runtime.release.apex" public_key="vendor/yoyodyne/security/testkeys/com.android.runtime.avbpubkey" private_key="vendor/yoyodyne/security/testkeys/com.android.runtime.pem" container_certificate="vendor/yoyodyne/security/testkeys/com.google.android.runtime.release_container.x509.pem" container_private_key="vendor/yoyodyne/security/testkeys/com.google.android.runtime.release_container.pk8"

ولديك الملفات التالية التي تحتوي على مفاتيح الإصدار:

vendor/yoyodyne/security/runtime_apex_container.x509.pem
vendor/yoyodyne/security/runtime_apex_container.pk8
vendor/yoyodyne/security/runtime_apex_payload.pem

يتجاوز الأمر التالي مفاتيح التوقيع com.android.runtime.release.apex و com.android.tzdata.apex أثناء توقيع الإصدار. وعلى وجه الخصوص، تم توقيع "com.android.runtime.release.apex" باستخدام مفاتيح الإصدار (runtime_apex_container لملف APEX) runtime_apex_payload لحمولة صورة الملف). يتم التعامل مع com.android.tzdata.apex على أنّه موقَّع مسبقًا. جميع ملفات APEX الأخرى تتم معالجة الملفات من خلال الإعداد التلقائي كما هو موضَّح في الملفات الهدف.

./build/make/tools/releasetools/sign_target_files_apks \
    --default_key_mappings   vendor/yoyodyne/security/tardis \
    --extra_apks             com.android.runtime.release.apex=vendor/yoyodyne/security/runtime_apex_container \
    --extra_apex_payload_key com.android.runtime.release.apex=vendor/yoyodyne/security/runtime_apex_payload.pem \
    --extra_apks             com.android.media.apex= \
    --extra_apex_payload_key com.android.media.apex= \
    -o tardis-target_files.zip \
    signed-tardis-target_files.zip

يؤدي تشغيل الأمر أعلاه إلى الحصول على السجلات التالية:

        [...]
    signing: com.android.runtime.release.apex                  container (vendor/yoyodyne/security/runtime_apex_container)
           : com.android.runtime.release.apex                  payload   (vendor/yoyodyne/security/runtime_apex_payload.pem)
NOT signing: com.android.conscrypt.apex
        (skipped due to special cert string)
NOT signing: com.android.media.apex
        (skipped due to special cert string)
        [...]

خيارات أخرى

يعيد النص البرمجي للتوقيع sign_target_files_apks كتابة التصميم. ووصفه وبصمة إصبعه في ملفات خصائص الإصدار لتعكس أن يتم تصميمه هو بنية موقعة. تتحكم العلامة --tag_changes في ما يتم تعديله تتم على البصمة. شغِّل النص البرمجي باستخدام -h لرؤيته والوثائق المتعلقة بجميع العلامات.

إنشاء المفاتيح يدويًا

يستخدم Android مفاتيح RSA بحجم 2048 بت مع الأس العام 3. يمكنك إنشاء أزواج الشهادات/المفاتيح الخاصة باستخدام أداة opensl من openssl.org:

# generate RSA key
openssl genrsa -3 -out temp.pem 2048
Generating RSA private key, 2048 bit long modulus
....+++
.....................+++
e is 3 (0x3)

# create a certificate with the public part of the key
openssl req -new -x509 -key temp.pem -out releasekey.x509.pem -days 10000 -subj '/C=US/ST=California/L=San Narciso/O=Yoyodyne, Inc./OU=Yoyodyne Mobility/CN=Yoyodyne/emailAddress=yoyodyne@example.com'

# create a PKCS#8-formatted version of the private key
openssl pkcs8 -in temp.pem -topk8 -outform DER -out releasekey.pk8 -nocrypt

# securely delete the temp.pem file
shred --remove temp.pem

ينشئ الأمر opensl pkcs8 الموضح أعلاه ملف .pk8 مع عرض no كلمة مرور مناسبة للاستخدام مع نظام التصميم. لإنشاء ملف .pk8 مؤمن بكلمة مرور (وهو ما يجب عليك فعله مع كل مفاتيح الإصدار الفعلية)، استبدل الوسيطة -nocrypt باستخدام -passout stdin ثم opensl سيقوم بتشفير المفتاح الخاص بقراءة كلمة المرور من الإدخال القياسي. لا فستتم طباعة الطلب، فإذا كان stdin هو الوحدة الطرفية، سيظهر البرنامج معلقًا. عندما يحين وقت إدخال كلمة مرور. يمكن أن تكون القيم الأخرى يُستخدم في وسيطة المرور لقراءة كلمة المرور من مواقع أخرى؛ حيث التفاصيل، راجع وثائق opensl.

يحتوي ملف temp.pem المتوسط على المفتاح الخاص بدون أي نوع من الحماية بكلمة مرور، لذا تخلص منها بعناية عند إنشاء إصدار المفاتيح. بشكل خاص، قد لا تكون الأداة المساعدة GNUshred فعالة على الشبكة أو لأنظمة الملفات المُسجَّلة في دفتر يوميات. يمكنك استخدام دليل عامل موجود في قرص ذاكرة وصول عشوائي (RAM) (مثل قسم tmpfs) عند إنشاء مفاتيح لضمان استخدام القيم المتوسطة لا يتم الكشف عنها بدون قصد.

إنشاء ملفات صور

عندما يكون لديك signed-target_files.zip، عليك تنفيذ ما يلي: إنشاء الصورة حتى تتمكن من وضعها على الجهاز. لإنشاء الصورة الموقَّعة من الملفات الهدف، نفِّذ الأمر التالي من جذر Android الشجرة:

img_from_target_files signed-target_files.zip signed-img.zip
يحتوي الملف الناتج، signed-img.zip، على جميع ملفات .img. لتحميل صورة على أحد الأجهزة، يمكنك استخدام Fastboot (Fastboot) التالي:
fastboot update signed-img.zip