تستخدم صور نظام التشغيل Android توقيعات التشفير في مكانَين:
- يجب توقيع كل ملف
.apk
داخل الصورة. Android يستخدم "مدير الحزم" توقيع.apk
بطريقتين:- عند استبدال أحد التطبيقات، يجب أن يتم توقيعه باستخدام المفتاح نفسه المُستخدَم في
التطبيق القديم؛ للوصول إلى بيانات التطبيق القديم. وينطبق ذلك
سواء على تحديث تطبيقات المستخدمين من خلال استبدال
.apk
، أو استبدال تطبيق نظام بإصدار أحدث تم تثبيته ضمن/data
. - إذا أراد تطبيقان أو أكثر مشاركة رقم تعريف المستخدم (بحيث يمكنهم مشاركة وما إلى ذلك)، يجب توقيعها بنفس المفتاح.
- عند استبدال أحد التطبيقات، يجب أن يتم توقيعه باستخدام المفتاح نفسه المُستخدَم في
التطبيق القديم؛ للوصول إلى بيانات التطبيق القديم. وينطبق ذلك
سواء على تحديث تطبيقات المستخدمين من خلال استبدال
- يجب توقيع حِزم التحديثات عبر الهواء باستخدام أحد المفاتيح المتوقّعة من النظام، وإلا سترفض عملية التثبيت هذه الحِزم.
مفاتيح الإصدار
تتضمّن شجرة 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
:
- مفتاح تجريبي
- مفتاح تشفير تلقائي عام للحِزم التي لا تحدّد مفتاحًا
- نظام
- مفتاح اختبار للحِزم التي تشكّل جزءًا من المنصة الأساسية:
- تمت المشاركة
- اختبار المفتاح للعناصر التي تتم مشاركتها في عملية المنزل/جهات الاتصال.
- وسائط
- مفتاح اختبار للحِزم التي تشكّل جزءًا من نظام الوسائط/التنزيل
تحدد الحزم الفردية أحد هذه المفاتيح عن طريق تعيين 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 keyopenssl 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 keyopenssl 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 keyopenssl pkcs8 -in temp.pem -topk8 -outform DER -out releasekey.pk8 -nocrypt
# securely delete the temp.pem fileshred --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