Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

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

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

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

Phát hành khóa

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

Để tạo bộ khóa 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 của bạn:

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

Để tạo hình ảnh 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

Các sign_target_files_apks kịch bản có một mục tiêu-file .zip như là đầu vào và tạo ra một mới mục tiêu-file .zip trong đó tất cả các .apk file đã được ký kết với các phím mới. Những hình ảnh mới được ký kết có thể được tìm thấy dưới IMAGES/ trong signed-target_files.zip .

Ký các gói OTA

Một ký mục tiêu-file zip có thể được chuyển đổi thành một ký OTA cập nhật zip bằng cách sử dụng thủ tục sau đây:
ota_from_target_files \
-k  (--package_key) 
signed-target_files.zip \
signed-ota_update.zip

Chữ ký và sideloading

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

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

Theo mặc định, các mục tiêu-file .zip được sản xuất bởi bộ xây dựng Giấy chứng nhận OTA để phù hợp với chìa khóa thử nghiệm. Trên hình ảnh đã phát hành, một chứng chỉ khác phải được sử dụng để các thiết bị có thể xác minh tính xác thực của gói cập nhật. Đi qua các -o cờ để sign_target_files_apks , như trong phần trước, thay thế chứng chỉ khóa thử nghiệm với các chứng chỉ khóa giải thoát ra khỏi thư mục certs của bạn.

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 bộ khóa công khai OTA. Bằng cách thêm một chìa khóa để chỉ tập phục hồi của các phím, có thể đăng ký các gói có thể được cài đặt chỉ qua sideloading (giả định cơ chế cập nhật tải về hệ thống chính được thực hiện một cách chính xác xác minh chống lại otacerts.zip). Bạn có thể chỉ định các khóa phụ chỉ được đưa vào khôi phục bằng cách đặt biến PRODUCT_EXTRA_RECOVERY_KEYS trong định nghĩa sản phẩm của mình:

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

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

Điều này bao gồm khóa công khai vendor/yoyodyne/security/tardis/sideload.x509.pem trong file khóa khôi phục để nó có thể cài đặt các gói ký kết với nó. Chìa khóa thêm không được bao gồm trong dù otacerts.zip, vì vậy hệ thống xác minh một cách chính xác các gói tải về không invoke phục hồi đối với các gói đã ký với phím này.

Chứng chỉ và khóa cá nhân

Mỗi phím đi kèm trong hai tập tin: giấy chứng nhận, trong đó có các .x509.pem mở rộng, và khóa bí mật, trong đó có các .pk8 mở rộng. Khóa riêng tư nên được giữ bí mật và cần thiết để ký một gói. Bản thân khóa có thể được bảo vệ bằng mật khẩu. Ngược lại, chứng chỉ chỉ chứa một nửa công khai của khóa, vì vậy nó có thể được phân phối rộng rãi. Nó được sử dụng để xác minh một gói đã được ký bằng khóa cá nhân tương ứng.

Tiêu chuẩn xây dựng Android sử dụng năm phím, tất cả đều trú tại build/target/product/security :

khóa kiểm tra
Khóa mặc định chung cho các gói không chỉ định khóa khác.
nền tảng
Khóa kiểm tra cho các gói là một phần của nền tảng cốt lõi.
đã chia sẻ
Khóa kiểm tra những thứ được chia sẻ trong quá trình gia đình / danh bạ.
phương tiện truyền thông
Khóa kiểm tra cho các gói là một phần của hệ thống tải xuống / phương tiện.
mạng lưới
Khóa kiểm tra cho các gói là một phần của hệ thống mạng. Chìa khóa networkstack được sử dụng để đăng binaries thiết kế như Modular hệ thống Components . Nếu các bản cập nhật mô-đun của bạn được tạo riêng và được tích hợp dưới dạng bản dựng sẵn trong hình ảnh thiết bị của bạn, bạn có thể không cần tạo khóa mạng trong cây nguồn Android.

Các gói riêng lẻ chỉ định một trong các khóa này bằng cách đặt LOCAL_CERTIFICATE trong tệp Android.mk của chúng. (khóa kiểm tra được sử dụng nếu biến này không được đặt.) Bạn cũng có thể chỉ định một khóa 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

Bây giờ xây dựng sử dụng các device/yoyodyne/security/special.{x509.pem,pk8} chìa khóa để ký SpecialApp.apk. Việc xây dựng có thể sử dụng chỉ khóa riêng mà không phải là mật khẩu bảo vệ.

Tùy chọn ký nâng cao

Thay thế khóa ký APK

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

Sử dụng các --key_mapping--default_key_mappings cờ để chỉ định thay thế chìa khóa dựa trên tên then chốt:

  • Các --key_mapping src_key = dest_key cờ quy định cụ thể thay thế cho một chìa khóa cùng một lúc.
  • Các --default_key_mappings dir cờ chỉ định một thư mục với năm phím để thay thế tất cả các phím trong build/target/product/security ; nó tương đương với sử dụng --key_mapping gấp năm lần để xác định ánh xạ.
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ác --extra_apks apk_name1,apk_name2,... = key cờ để xác định thay thế chìa khóa ký dựa trên tên apk. Nếu key được để trống, những xử lý kịch bản APK đã quy định như tiền ký.

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

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ư thế này:

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

Điều này dẫn đến những điều 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 khiến người sử dụng cho các mật khẩu cho tất cả các khóa mật khẩu bảo vệ, kịch bản tái dấu hiệu tất cả các file APK trong mục tiêu đầu vào .zip với các phím phát hành. Trước khi chạy lệnh, bạn cũng có thể thiết lập các ANDROID_PW_FILE biến môi trường để một tên tập tin tạm thời; sau đó tập lệnh sẽ gọi trình soạn thảo của bạn để cho phép bạn nhập mật khẩu cho tất cả các khóa (đây có thể là cách thuận tiện hơn để nhập mật khẩu).

Thay thế khóa ký APEX

Android 10 giới thiệu các định dạng tập tin APEX cho việc cài đặt các module hệ thống cấp thấp hơn. Như đã giải thích trong APEX ký , mỗi file APEX được ký kết với hai phím: một cho hình ảnh hệ thống tập tin nhỏ trong một APEX và một cho toàn bộ APEX.

Khi ký phát hành, hai khóa ký cho tệp APEX được thay thế bằng khóa phát hành. Các hệ thống tập tin quan trọng tải trọng được xác định với --extra_apex_payload cờ và toàn bộ APEX chìa khóa ký tập tin được xác định với --extra_apks cờ.

Đối với sản phẩm TARDIS, giả sử rằng bạn có cấu hình chính sau đây cho com.android.conscrypt.apex , com.android.media.apex , và com.android.runtime.release.apex file 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 khóa 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 sẽ ghi đè các phím ký cho com.android.runtime.release.apexcom.android.tzdata.apex trong ký phát hành. Đặc biệt, com.android.runtime.release.apex được ký kết với các phím phát hành cụ thể ( runtime_apex_container cho file APEX, và runtime_apex_payload cho hình ảnh tải tập tin). com.android.tzdata.apex được coi là tiền ký. Tất cả các tệp APEX khác được xử lý bởi 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

Chạy lệnh trên sẽ cho các bản ghi 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)
        [...]

Sự lựa chọn khác

Các sign_target_files_apks ký viết lại kịch bản mô tả xây dựng và dấu vân tay trong các tập tin xây dựng bất động sản để phản ánh rằng việc xây dựng là một ký xây dựng. Các --tag_changes điều khiển cờ gì chỉnh sửa được thực hiện với dấu vân tay. Chạy tập lệnh có -h để xem tài liệu trên tất cả các lá cờ.

Tạo khóa theo cách thủ công

Sử dụng Android phím RSA 2048-bit với số mũ công khai 3. Bạn có thể tạo một chứng chỉ / tin cặp khóa 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 đưa ra ở trên tạo ra một tập tin .pk8 không có mật khẩu, phù hợp để sử dụng với các hệ thống xây dựng. Để tạo một .pk8 bảo vệ bằng mật khẩu (mà bạn nên làm cho tất cả các phím phát hành thực tế), thay thế các -nocrypt tranh cãi với -passout stdin ; thì openssl sẽ mã hóa khóa cá nhân bằng mật khẩu được đọc từ đầu vào tiêu chuẩn. Không có lời nhắc nào được in, vì vậy nếu stdin là terminal, chương trình sẽ có vẻ như bị treo khi nó thực sự chỉ chờ bạn nhập mật khẩu. Các giá trị khác có thể được sử dụng cho đối số-passout để đọc mật khẩu từ các vị trí khác; để biết chi tiết, vui lòng xem tài liệu openssl .

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

Tạo tệp hình ảnh

Khi bạn đã ký-target-files.zip, bạn cần tạo hình ảnh để có thể đưa nó vào 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ây Android:

img_from_target_files signed-target-files.zip signed-img.zip
Các tập tin kết quả, signed-img.zip , chứa tất cả các file .img. Để tải một hình ảnh lên một thiết bị, sử dụng fastboot như sau:
fastboot update signed-img.zip