Hình ảnh hệ điều hành Android sử dụng chữ ký mã hoá ở 2 nơi:
- 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á.
- 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 đè
- 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.
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
và --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á trongbuild/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.apex
và
com.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.apex
và
com.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 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
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.zipTệ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