रिलीज़ के लिए बिल्ड पर हस्ताक्षर करना

Android OS इमेज, क्रिप्टोग्राफ़िक हस्ताक्षर का इस्तेमाल दो जगहों पर करती हैं:

  1. इमेज में मौजूद हर .apk फ़ाइल पर हस्ताक्षर होना चाहिए. Android का Package Manager, .apk हस्ताक्षर का इस्तेमाल दो तरीकों से करता है:
    • जब किसी ऐप्लिकेशन को बदला जाता है, तो उसे उसी कुंजी से साइन किया जाना चाहिए जिससे पुराने ऐप्लिकेशन को साइन किया गया था. ऐसा करने पर, पुराने ऐप्लिकेशन के डेटा को ऐक्सेस किया जा सकता है. यह बात, .apk को ओवरराइट करके उपयोगकर्ता के ऐप्लिकेशन अपडेट करने और /data में इंस्टॉल किए गए नए वर्शन के साथ सिस्टम ऐप्लिकेशन को बदलने, दोनों के लिए सही है.
    • अगर दो या उससे ज़्यादा ऐप्लिकेशन को उपयोगकर्ता आईडी शेयर करना है, ताकि वे डेटा वगैरह शेयर कर सकें, तो उन पर एक ही पासकोड से साइन किया जाना चाहिए.
  2. ओटीए अपडेट पैकेज पर, सिस्टम की ज़रूरी शर्तों के मुताबिक किसी एक कुंजी से हस्ताक्षर किया जाना चाहिए. ऐसा न करने पर, इंस्टॉलेशन की प्रोसेस उन्हें अस्वीकार कर देगी.

रिलीज़ कुंजियां

Android ट्री में, build/target/product/security में test-keys शामिल हैं. make का इस्तेमाल करके Android OS इमेज बनाने पर, सभी .apk फ़ाइलों को टेस्ट-की का इस्तेमाल करके साइन किया जाएगा. टेस्ट-की सार्वजनिक तौर पर उपलब्ध होती हैं. इसलिए, कोई भी व्यक्ति इनकी मदद से अपनी .apk फ़ाइलों पर हस्ताक्षर कर सकता है. इससे, वह आपके ओएस इमेज में पहले से मौजूद सिस्टम ऐप्लिकेशन को बदल सकता है या हाइजैक कर सकता है. इसलिए, सार्वजनिक तौर पर रिलीज़ की गई या डिप्लॉय की गई किसी भी Android OS इमेज पर, रिलीज़-की के खास सेट से हस्ताक्षर करना ज़रूरी है. इस सेट का ऐक्सेस सिर्फ़ आपके पास होना चाहिए.

रिलीज़-की का अपना यूनीक सेट जनरेट करने के लिए, अपने 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 फ़ाइलों पर नई कुंजियों से हस्ताक्षर किए गए होते हैं. हाल ही में साइन की गई इमेज, signed-target_files.zip में IMAGES/ में मिल सकती हैं.

ओटीए पैकेज पर हस्ताक्षर करना

हस्ताक्षर की गई टारगेट-फ़ाइलों के ज़िप को, हस्ताक्षर किए गए ओटीए अपडेट के ज़िप में बदला जा सकता है. इसके लिए, यह तरीका अपनाएं:
ota_from_target_files \
-k  (--package_key) 
signed-target_files.zip \
signed-ota_update.zip

हस्ताक्षर और साइडलोडिंग

साइडलोड करने से, रिकवरी के पैकेज के हस्ताक्षर की पुष्टि करने के सामान्य तरीके को बायपास नहीं किया जाता. किसी पैकेज को इंस्टॉल करने से पहले, रिकवरी यह पुष्टि करेगी कि उस पर किसी निजी पासकोड से हस्ताक्षर किया गया है या नहीं. यह निजी पासकोड, रिकवरी पार्टिशन में सेव किए गए सार्वजनिक पासकोड से मेल खाना चाहिए. यह पुष्टि ठीक उसी तरह की जाएगी जिस तरह ओवर-द-एयर डिलीवर किए गए पैकेज के लिए की जाती है.

मुख्य सिस्टम से मिले अपडेट पैकेज की आम तौर पर दो बार पुष्टि की जाती है: पहली बार मुख्य सिस्टम से, Android API में RecoverySystem.verifyPackage() तरीके का इस्तेमाल करके और फिर रिकवरी से. 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 में मौजूद होती हैं:

testkey
उन पैकेज के लिए सामान्य डिफ़ॉल्ट पासकोड जिनमें कोई पासकोड नहीं दिया गया है.
प्लेटफ़ॉर्म
कोर प्लैटफ़ॉर्म के हिस्से के तौर पर मौजूद पैकेज के लिए टेस्ट पासकोड.
शेयर किया गया
होम/संपर्कों की प्रोसेस में शेयर की गई चीज़ों के लिए पासकोड की जांच करें.
media
मीडिया/डाउनलोड सिस्टम के हिस्से के तौर पर मौजूद पैकेज के लिए टेस्ट पासकोड.
networkstack
नेटवर्किंग सिस्टम के हिस्से के तौर पर मौजूद पैकेज के लिए टेस्ट पासकोड. मॉड्यूलर सिस्टम कॉम्पोनेंट के तौर पर डिज़ाइन की गई बाइनरी को साइन करने के लिए, नेटवर्कस्टैक पासकोड का इस्तेमाल किया जाता है. अगर आपके मॉड्यूल के अपडेट अलग से बनाए गए हैं और उन्हें डिवाइस इमेज में पहले से बने के तौर पर इंटिग्रेट किया गया है, तो हो सकता है कि आपको Android सोर्स ट्री में नेटवर्कस्टैक पासकोड जनरेट करने की ज़रूरत न पड़े.

अलग-अलग पैकेज, अपनी Android.mk फ़ाइल में LOCAL_CERTIFICATE को सेट करके, इनमें से किसी एक कुंजी की जानकारी देते हैं. (अगर यह वैरिएबल सेट नहीं है, तो testkey का इस्तेमाल किया जाता है.) पाथनाम के हिसाब से, पूरी तरह से अलग कुंजी भी तय की जा सकती है. उदाहरण के लिए:

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

LOCAL_CERTIFICATE := device/yoyodyne/security/special

अब SpecialApp.apk को साइन करने के लिए, बिल्ड में device/yoyodyne/security/special.{x509.pem,pk8} पासकोड का इस्तेमाल किया जाता है. बिल्ड में सिर्फ़ उन निजी कुंजियों का इस्तेमाल किया जा सकता है जिन्हें पासवर्ड से सुरक्षित नहीं किया गया हो.

हस्ताक्षर करने के बेहतर विकल्प

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

APK के नाम के आधार पर, साइनिंग पासकोड बदलने के लिए, --extra_apks apk_name1,apk_name2,...=key फ़्लैग का इस्तेमाल करें. अगर key को खाली छोड़ा जाता है, तो स्क्रिप्ट, बताए गए APK को पहले से हस्ताक्षर किए गए APK मानती है.

ऊपर दिए गए उदाहरण में, टार्डिस प्रॉडक्ट के लिए, आपको पासवर्ड से सुरक्षित छह कुंजियों की ज़रूरत होगी: build/target/product/security में मौजूद पांच कुंजियों की जगह पांच और ऊपर दिए गए उदाहरण में SpecialApp के लिए ज़रूरी अतिरिक्त कुंजी device/yoyodyne/security/special की जगह एक. अगर कुंजियां इन फ़ाइलों में थीं:

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.

पासवर्ड से सुरक्षित की गई सभी कुंजियों के लिए, उपयोगकर्ता से पासवर्ड मांगने के बाद, स्क्रिप्ट रिलीज़ कुंजियों के साथ इनपुट टारगेट .zip में मौजूद सभी APK फ़ाइलों पर फिर से हस्ताक्षर करती है. कमांड चलाने से पहले, 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 पर तय की गई रिलीज़ कुंजियों (APEX फ़ाइल के लिए runtime_apex_container और फ़ाइल इमेज पेलोड के लिए 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, सार्वजनिक एक्सपोनेंट 3 के साथ 2048-बिट आरएसए कुंजियों का इस्तेमाल करता है. openssl.org से openssl टूल का इस्तेमाल करके, सर्टिफ़िकेट/निजी कुंजी के जोड़े जनरेट किए जा सकते हैं:

# 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 से बदलें. इसके बाद, openssl, स्टैंडर्ड इनपुट से पढ़े गए पासवर्ड से निजी कुंजी को एन्क्रिप्ट कर देगा. कोई प्रॉम्प्ट नहीं दिखता है. इसलिए, अगर stdin टर्मिनल है, तो प्रोग्राम तब भी लटका हुआ दिखेगा, जब वह आपके पासवर्ड डालने का इंतज़ार कर रहा हो. अन्य जगहों से पासवर्ड पढ़ने के लिए, the-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 update signed-img.zip