Ký bản dựng để phát hành

Hình ảnh hệ điều hành Android sử dụng chữ ký mã hoá ở 2 nơi:

  1. Mỗi tệp .apk bên trong hình ảnh đó đều phải có chữ ký. của Android Trình quản lý gói sử dụng chữ ký .apk theo 2 cách:
    • Khi được thay thế, ứng dụng phải được ký bằng cùng một khoá với ứng dụng cũ để có quyền truy cập vào dữ liệu của ứng dụng cũ. Khoản này là đúng cho cả việc cập nhật ứng dụng của người dùng bằng cách ghi đè .apk và cho ghi đè ứng dụng hệ thống bằng phiên bản mới hơn được cài đặt trong /data.
    • Nếu hai hoặc nhiều ứng dụng muốn chia sẻ một mã nhận dạng người dùng (để chúng có thể chia sẻ) dữ liệu, v.v.), các dữ liệu này phải được ký bằng cùng một khoá.
  2. Gói cập nhật OTA phải được ký bằng một trong các khoá mà hệ thống hoặc quá trình cài đặt sẽ từ chối quảng cáo.

Phím nhả

Cây Android bao gồm các khoá kiểm thử trong build/target/product/security. Xây dựng hình ảnh cho hệ điều hành Android sử dụng make sẽ ký tất cả .apk tệp bằng khoá kiểm thử. Vì các khoá kiểm thử đều được biết công khai, nên mọi người đều có thể tự ký Tệp .apk có các khoá giống nhau, nên chúng có thể thay thế hoặc xâm nhập hệ thống các ứng dụng được tích hợp vào hình ảnh hệ điều hành của bạn. Vì vậy, điều quan trọng là bạn phải ký bất kỳ hình ảnh hệ điều hành Android được phát hành hoặc triển khai công khai với một tập hợp đặc biệt khoá-khoá mà chỉ bạn mới có quyền truy cập.

Để tạo bộ khoá phát hành duy nhất của riêng bạn, hãy chạy các lệnh sau từ gốc của cây 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 cần được thay đổi để phản ánh của bạn. Bạn có thể sử dụng bất kỳ thư mục nào, nhưng hãy cẩn thận khi chọn một sao lưu và an toàn. Một số nhà cung cấp chọn mã hoá khoá riêng tư của họ bằng một cụm mật khẩu mạnh và lưu trữ khoá đã mã hoá trong kiểm soát nguồn; những người khác lưu trữ toàn bộ khoá phát hành của họ ở một nơi khác, chẳng hạn như trên một chiếc máy tính ngăn cách không khí.

Để tạo hình ảnh bản phát hành, hãy sử dụng:

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

Tập lệnh sign_target_files_apks lấy các tệp đích .zip làm đầu vào và tạo một tệp mục tiêu mới .zip trong tất cả tệp .apk đã được ký bằng khoá mới. Mới có thể tìm thấy hình ảnh có chữ ký trong IMAGES/ trên signed-target_files.zip.

Ký gói OTA

Có thể chuyển đổi tệp zip của tệp đích đã ký thành tệp zip cập nhật OTA đã ký bằng quy trình sau:
ota_from_target_files \
-k  (--package_key) 
signed-target_files.zip \
signed-ota_update.zip

Chữ ký và cài đặt không qua cửa hàng ứng dụng

Cài đặt không qua cửa hàng không bỏ qua chữ ký gói thông thường của khôi phục cơ chế xác minh—trước khi cài đặt gói, quá trình khôi phục sẽ xác minh rằng nó được ký bằng một trong các khoá riêng tư khớp với khoá công khai được lưu trữ trong phân vùng khôi phục, giống như đối với một gói được gửi qua mạng không dây.

Các gói cập nhật nhận được từ hệ thống chính thường được xác minh hai lần: một lần theo hệ thống chính, bằng cách sử dụng RecoverySystem.verifyPackage() trong API android rồi lặp lại bằng cách khôi phục. RecoverySystem API kiểm tra chữ ký với các khoá công khai được lưu trữ trong hệ thống chính, trong tệp /system/etc/security/otacerts.zip (theo mặc định). Tính năng khôi phục sẽ kiểm tra chữ ký với các khoá công khai được lưu trữ trong ổ đĩa RAM của phân vùng khôi phục, trong tệp /res/keys.

Theo mặc định, các tệp mục tiêu .zip do bản dựng tạo ra sẽ đặt giá trị Chứng chỉ OTA để khớp với khoá kiểm tra. Trên một hình ảnh được phát hành, một phải sử dụng chứng chỉ để thiết bị có thể xác minh tính xác thực của cập nhật gói. Chuyển cờ -o đến sign_target_files_apks, như được hiển thị trong phần trước, thay thế chứng chỉ khoá kiểm tra có chứng chỉ khoá phát hành từ các chứng chỉ của bạn thư mục.

Thông thường, hình ảnh hệ thống và hình ảnh khôi phục lưu trữ cùng một nhóm OTA khoá công khai. Bằng cách thêm khoá chỉ vào bộ khoá khôi phục, có thể ký các gói chỉ có thể cài đặt thông qua cài đặt không qua cửa hàng ứng dụng (giả sử cơ chế tải bản cập nhật xuống của hệ thống chính đang hoạt động chính xác xác minh dựa trên otacerts.zip). Bạn có thể chỉ định các khoá bổ sung để chỉ được bao gồm trong quá trình khôi phục bằng cách đặt PRODUCT_EXTRA_RECOVERY_KEYS trong định nghĩa sản phẩm:

vendor/yoyodyne/tardis/products/tardis.mk
 [...]

PRODUCT_EXTRA_RECOVERY_KEYS := vendor/yoyodyne/security/tardis/sideload

bao gồm cả khoá công khai vendor/yoyodyne/security/tardis/sideload.x509.pem trong quá trình khôi phục tệp khoá để có thể cài đặt các gói đã ký với nó. Tuy nhiên, khoá bổ sung không có trong tệp otacerts.zip, vì vậy hệ thống xác minh chính xác gói được tải xuống không gọi khôi phục cho các gói được ký bằng khoá này.

Chứng chỉ và khoá riêng tư

Mỗi khoá có hai tệp: chứng chỉ, trong đó có đuôi .x509.pem và khoá riêng tư có đuôi là .pk8. Khoá riêng tư phải được giữ bí mật và cần thiết cho việc ký gói. Chìa khoá có thể được bảo vệ bằng mật khẩu. Chứng chỉ, trong ngược lại, chỉ chứa một nửa khoá công khai nên có thể phân phối khoá một cách rộng rãi. Mã này được dùng để xác minh một gói đã được ký bởi khoá riêng tư.

Bản dựng Android tiêu chuẩn dùng 5 khoá, tất cả đều nằm trong build/target/product/security:

khoá kiểm thử
Khoá mặc định chung cho các gói không chỉ định khoá.
nền tảng
Kiểm thử khoá cho các gói là một phần của nền tảng cốt lõi.
đã chia sẻ
Kiểm tra chìa khoá cho những nội dung được chia sẻ trong quy trình liên hệ tại nhà/danh bạ.
truyền-thông
Khoá kiểm thử cho các gói thuộc hệ thống nội dung nghe nhìn/hệ thống tải xuống.
ngăn xếp mạng
Khoá kiểm thử cho các gói thuộc hệ thống mạng. Chiến lược phát hành đĩa đơn khoá Networkstack được dùng để ký các tệp nhị phân được thiết kế dưới dạng Các thành phần của hệ thống mô-đun . Nếu các bản cập nhật mô-đun được xây dựng riêng biệt và tích hợp dưới dạng thiết bị tạo sẵn trong hình ảnh thiết bị, bạn có thể không cần tạo khoá ngăn xếp mạng trong Cây nguồn Android.

Các gói riêng lẻ chỉ định một trong các khoá này bằng cách đặt LOCAL_CERTIFICATE trong tệp Android.mk. (khoá kiểm thử sẽ được dùng nếu biến này không được đặt.) Bạn cũng có thể chỉ định một khoá hoàn toàn khác theo tên đường dẫn, ví dụ:

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

LOCAL_CERTIFICATE := device/yoyodyne/security/special

Hiện bản dựng này sử dụng khoá device/yoyodyne/security/special.{x509.pem,pk8} để ký SpecialApp.apk. Bản dựng chỉ có thể sử dụng các khoá riêng tư không được bảo vệ bằng mật khẩu.

Tuỳ chọn ký nâng cao

Thay thế khoá ký APK

Tập lệnh ký sign_target_files_apks hoạt động trên mục tiêu tệp được tạo cho một bản dựng. Tất cả thông tin về chứng chỉ và thông tin riêng tư các khoá dùng tại thời điểm xây dựng sẽ được đưa vào tệp đích. Khi chạy tập lệnh ký để ký phát hành, khoá ký có thể được thay thế dựa trên khoá hoặc tên APK.

Sử dụng --key_mapping--default_key_mappings cờ để chỉ định việc thay thế khoá dựa trên tên khoá:

  • Cờ --key_mapping src_key=dest_key chỉ định thay thế một khoá mỗi lần.
  • Cờ --default_key_mappings dir chỉ định một có 5 khoá để thay thế tất cả các khoá trong build/target/product/security; thì tương đương với việc sử dụng --key_mapping 5 lần để chỉ định mối liên kết.
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

Sử dụng Cờ --extra_apks apk_name1,apk_name2,...=key để chỉ định thay thế khoá ký dựa trên tên APK. Nếu key bị để trống, tập lệnh sẽ xử lý các APK được chỉ định dưới dạng được ký trước.

Đối với sản phẩm tardis giả định, bạn cần có 6 khoá được bảo vệ bằng mật khẩu: số năm để thay thế số năm trong build/target/product/security và một để thay thế khoá device/yoyodyne/security/special bổ sung theo yêu cầu của SpecialApp trong ví dụ ở trên. Nếu các khoá nằm trong các trường hợp sau tệp:

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

Sau đó, bạn sẽ ký tất cả các ứng dụng như sau:

./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

Thao tác này sẽ hiển thị như sau:

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.

Sau khi nhắc người dùng nhập mật khẩu cho tất cả các khoá được bảo vệ bằng mật khẩu, tập lệnh sẽ ký lại tất cả các tệp APK trong mục tiêu đầu vào .zip bằng phím giải phóng. Trước khi chạy lệnh, bạn cũng có thể đặt biến môi trường ANDROID_PW_FILE thành tên tệp tạm thời; thời gian rồi gọi trình chỉnh sửa để cho phép bạn nhập mật khẩu cho tất cả các khoá (đây có thể là một cách thuận tiện hơn để nhập mật khẩu).

Thay thế khoá ký APEX

Android 10 ra mắt Định dạng tệp APEX để cài đặt các mô-đun hệ thống cấp thấp hơn. Như được giải thích trong Ký APEX, mỗi tệp APEX được ký bằng hai khoá: một cho hình ảnh hệ thống tệp nhỏ trong một APEX và khác cho toàn bộ APEX.

Khi ký bản phát hành, hai khoá ký cho tệp APEX sẽ được thay thế bằng phím phát hành. Khoá tải trọng hệ thống tệp được chỉ định bằng Cờ --extra_apex_payload và toàn bộ khoá ký tệp APEX là được chỉ định bằng cờ --extra_apks.

Đối với sản phẩm tardis, giả sử bạn có cấu hình khoá sau đây cho com.android.conscrypt.apex, com.android.media.apexcom.android.runtime.release.apex tệp 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"

Và bạn có các tệp sau chứa khoá phát hành:

vendor/yoyodyne/security/runtime_apex_container.x509.pem
vendor/yoyodyne/security/runtime_apex_container.pk8
vendor/yoyodyne/security/runtime_apex_payload.pem

Lệnh sau đây ghi đè các khoá ký cho com.android.runtime.release.apexcom.android.tzdata.apex trong quá trình ký phát hành. Cụ thể, com.android.runtime.release.apex được ký bằng khoá phát hành (runtime_apex_container cho tệp APEX, và runtime_apex_payload cho tải trọng hình ảnh của tệp). com.android.tzdata.apex được coi là đã ký trước. Tất cả APEX khác các tệp được xử lý bằng cấu hình mặc định như được liệt kê trong các tệp đích.

./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

Việc chạy lệnh trên cung cấp các nhật ký sau:

        [...]
    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)
        [...]

Tùy chọn khác

Tập lệnh ký sign_target_files_apks sẽ viết lại bản dựng trong các tệp thuộc tính bản dựng để phản ánh rằng bản dựng là một bản dựng đã ký. Cờ --tag_changes kiểm soát nội dung chỉnh sửa được tạo đối với vân tay. Chạy tập lệnh bằng -h để xem về tất cả cờ.

Tạo khoá theo cách thủ công

Android sử dụng khoá RSA 2048 bit với số mũ công khai 3. Bạn có thể tạo chứng chỉ/khoá riêng tư bằng công cụ openssl từ 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

Lệnh openssl pkcs8 nêu trên sẽ tạo một tệp .pk8 chứa no mật khẩu, thích hợp để sử dụng với hệ thống xây dựng. Để tạo một tệp .pk8 được bảo mật bằng mật khẩu (bạn nên thực hiện thao tác này cho tất cả các phím phát hành thực tế), thay thế Đối số -nocrypt với -passout stdin; sau đó, openssl sẽ mã hoá khoá riêng tư bằng mật khẩu được đọc từ dữ liệu đầu vào tiêu chuẩn. Không câu lệnh sẽ được in, vì vậy nếu stdin là thiết bị đầu cuối thì chương trình sẽ treo khi thực sự chỉ chờ bạn nhập mật khẩu. Các giá trị khác có thể là dùng cho đối số trả về để đọc mật khẩu từ các vị trí khác; với chi tiết, hãy xem tài liệu openssl.

Tệp trung gian temp.pem chứa khoá riêng tư mà không có bất kỳ loại khoá nào bảo vệ bằng mật khẩu, vì vậy, hãy cẩn thận khi vứt bỏ tính năng này khi tạo bản phát hành khoá. Cụ thể, tiện ích GNUshred có thể không có hiệu lực trên mạng hoặc hệ thống tệp được ghi nhật ký. Bạn có thể dùng một thư mục đang hoạt động nằm trong ổ đĩa RAM (chẳng hạn như phân vùng tmpfs) khi tạo khoá để đảm bảo trung gian không vô tình bị hiển thị.

Tạo tệp hình ảnh

Khi có signed-target_files.zip, bạn cần tạo hình ảnh để bạn có thể đặt lên thiết bị. Để tạo hình ảnh đã ký từ các tệp đích, hãy chạy lệnh sau từ thư mục gốc của cửa sổ Android cây:

img_from_target_files signed-target_files.zip signed-img.zip
Tệp kết quả, signed-img.zip, chứa tất cả các tệp .img. Để tải hình ảnh vào thiết bị, hãy sử dụng tính năng khởi động nhanh làm sau:
fastboot update signed-img.zip