রিলিজের জন্য বিল্ডে সাইন করা

Android OS ইমেজে দুটি জায়গায় ক্রিপ্টোগ্রাফিক সিগনেচার ব্যবহার করা হয়:

  1. ছবির মধ্যে থাকা প্রতিটি .apk ফাইলকে অবশ্যই সাইন করতে হবে। Android-এর প্যাকেজ ম্যানেজার দু'ভাবে .apk স্বাক্ষর ব্যবহার করে:
    • কোনও অ্যাপ্লিকেশন রিপ্লেস করা হলে, পুরনো অ্যাপ্লিকেশনের ডেটা অ্যাক্সেস করার জন্য পুরনো অ্যাপ্লিকেশনের মতোই একই কী দিয়ে সেটিতে সাইন-ইন করতে হবে। .apk ওভাররাইট করে ব্যবহারকারীর অ্যাপ আপডেট করা এবং /data-এর অধীনে ইনস্টল করা নতুন ভার্সন দিয়ে সিস্টেম অ্যাপ ওভাররাইড করা, দুটি ক্ষেত্রেই এটি সত্যি।
    • দুটি বা তার বেশি অ্যাপ্লিকেশন যদি কোনও ব্যবহারকারীর আইডি শেয়ার করতে চায় (যাতে তারা ডেটা ইত্যাদি শেয়ার করতে পারে), তাহলে তাদের একই 'কী' দিয়ে সাইন-ইন করতে হবে।
  2. OTA আপডেট প্যাকেজগুলিকে সিস্টেমের প্রত্যাশিত কীগুলির মধ্যে একটি দিয়ে সাইন করতে হবে অন্যথায় ইনস্টলেশন প্রক্রিয়া সেগুলি বাতিল করে দেবে।

রিলিজ 'কী'

Android ট্রি-তে build/target/product/security-এর অধীনে test-keys অন্তর্ভুক্ত থাকে। make ব্যবহার করে Android OS ইমেজ তৈরি করলে তা test-keys ব্যবহার করে সব .apk ফাইল স্বাক্ষর করবে। যেহেতু টেস্ট-কী সর্বজনবিদিত, তাই যেকেউ একই কী দিয়ে নিজের .apk ফাইল সাইন করতে পারে, এর ফলে তারা আপনার OS ইমেজে বিল্ট-ইন সিস্টেম অ্যাপ পাল্টে দিতে বা হাইজ্যাক করতে পারে। এই কারণে, কোনও পাবলিক রিলিজ করা বা ডিপ্লয় করা 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 স্ক্রিপ্ট ইনপুট হিসেবে target-files .zip নেয় এবং নতুন target-files .zip তৈরি করে যেখানে সব .apk ফাইল নতুন কী দিয়ে সাইন করা হয়। নতুন করে সাইন করা ছবিগুলি IMAGES/-এর মধ্যে signed-target_files.zip দেখতে পাবেন।

OTA প্যাকেজে সাইন-ইন করুন

নিম্নলিখিত পদ্ধতি ব্যবহার করে একটি স্বাক্ষরিত টার্গেট-ফাইল জিপকে একটি স্বাক্ষরিত OTA আপডেট জিপে রূপান্তর করা যেতে পারে:
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 ফাইলে (ডিফল্ট হিসেবে) সিগনেচার চেক করে। রিকভারি, রিকভারি পার্টিশন RAM ডিস্কে সেভ করা সর্বজনীন কীয়ের সাথে /res/keys ফাইলে থাকা সিগনেচার চেক করে।

ডিফল্ট হিসেবে, বিল্ডের মাধ্যমে তৈরি করা টার্গেট-ফাইল .zip, টেস্ট কী-এর সাথে ম্যাচ করার জন্য OTA সার্টিফিকেট সেট করে। প্রকাশ করা ইমেজে, একটি আলাদা সার্টিফিকেট ব্যবহার করতে হবে যাতে ডিভাইসগুলি আপডেট প্যাকেজের সত্যতা যাচাই করতে পারে। আগের বিভাগে যেমন দেখানো হয়েছে, -o ফ্ল্যাগটি sign_target_files_apks-এ পাস করলে, আপনার certs ডিরেক্টরি থেকে রিলিজ কী সার্টিফিকেট দিয়ে টেস্ট কী সার্টিফিকেট প্রতিস্থাপন করা হয়।

সাধারণত সিস্টেম ইমেজ এবং রিকভারি ইমেজ একই সেট OTA সর্বজনীন কী স্টোর করে। শুধুমাত্র রিকভারি কী সেটে একটি কী যোগ করার মাধ্যমে, এমন প্যাকেজে সাইন করা সম্ভব যেগুলি শুধুমাত্র সাইডলোডিংয়ের মাধ্যমে ইনস্টল করা যায় (ধরে নেওয়া হচ্ছে যে মূল সিস্টেমের আপডেট ডাউনলোড করার মেকানিজম সঠিকভাবে 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
প্যাকেজের জন্য জেনেরিক ডিফল্ট কী যা অন্যথায় কোনও কী নির্দিষ্ট করে না।
প্ল্যাটফর্ম
কোর প্ল্যাটফর্মের অংশ এমন প্যাকেজের জন্য টেস্ট কী।
শেয়ার করা হয়েছে
হোম/পরিচিতি প্রসেসে শেয়ার করা জিনিসের জন্য টেস্ট কী।
মিডিয়া
মিডিয়া/ডাউনলোড সিস্টেমের অংশ এমন প্যাকেজের জন্য টেস্ট কী।
নেটওয়ার্কস্ট্যাক
নেটওয়ার্কিং সিস্টেমের অংশ এমন প্যাকেজের জন্য টেস্ট কী। The networkstack কী, মেইনলাইন মডিউল হিসেবে ডিজাইন করা বাইনারি সাইন করতে ব্যবহার করা হয়। আপনার মডিউল আপডেট আলাদাভাবে তৈরি করা হলে এবং আপনার ডিভাইস ইমেজে প্রি-বিল্ট হিসেবে ইন্টিগ্রেট করা হলে, আপনাকে Android সোর্স ট্রি-তে networkstack কী জেনারেট করতে নাও হতে পারে।

ব্যক্তিগত প্যাকেজ, তাদের 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-কে আগে থেকে সাইন করা হিসেবে বিবেচনা করে।

কাল্পনিক টার্ডিস প্রোডাক্টের জন্য, আপনার ছয়টি পাসওয়ার্ড-সুরক্ষিত কী প্রয়োজন: 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, পাবলিক এক্সপোনেন্ট ৩ সহ ২০৪৮-বিট RSA কী ব্যবহার করে। আপনি 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