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

تستخدم صور نظام التشغيل 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
مفتاح اختبار للحِزم التي تشكّل جزءًا من نظام الشبكات تشير رسالة الأشكال البيانية يُستخدم مفتاح 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، نفترض أنّ لديك إعدادات المفاتيح التالية لملفات APEX com.android.conscrypt.apex و com.android.media.apex و com.android.runtime.release.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. يمكنك إنشاء أزواج مفاتيح التشفير/الشهادات باستخدام أداة openssl من 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

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

يحتوي ملف 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