تستخدِم صور نظام التشغيل 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، لنفترض أنّ لديك إعدادات المفتاح التالية
لـ 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 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
ينشئ الأمر 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