apksigner - hướng dẫn tham khảo, tùy chọn, ví dụ về lệnh


TÊN

apksigner - ký và xác minh APK Android

TÓM TẮT

apksigner [options] apk

apksigner --version

apksigner --help

SỰ MIÊU TẢ

Một công cụ dòng lệnh để ký các tệp APK Android và để kiểm tra xem chữ ký của các tệp APK có xác minh trên thiết bị Android hay không.

apk là một tệp hiện có để ký hoặc xác minh.

apksig là một dự án nhằm mục đích đơn giản hóa việc ký APK và kiểm tra xem chữ ký của APK có nên xác minh trên Android hay không. apksig hỗ trợ ký JAR (được Android sử dụng kể từ ngày đầu tiên) và Lược đồ chữ ký APK v2 (được hỗ trợ kể từ Android Nougat, API cấp 24).

Tính năng chính của apksig là nó biết về sự khác biệt trong logic xác minh chữ ký APK giữa các phiên bản khác nhau của nền tảng Android. Do đó, apksig có thể kiểm tra xem APK đã ký có phải xác minh trên tất cả các phiên bản nền tảng Android được APK hỗ trợ hay không. Khi ký APK, apksig sẽ chọn thuật toán mã hóa phù hợp nhất dựa trên các phiên bản nền tảng Android được hỗ trợ bởi APK được ký.

LỆNH

sign

Thao tác này sẽ ký APK được cung cấp, loại bỏ mọi chữ ký đã có từ trước. Việc ký được thực hiện bằng cách sử dụng một hoặc nhiều người ký, mỗi người được đại diện bởi một cặp khóa bất đối xứng và chứng chỉ tương ứng. Thông thường, APK chỉ được ký bởi một người ký. Đối với mỗi người ký, bạn cần cung cấp khóa riêng và chứng chỉ của người ký.

verify

Điều này kiểm tra xem APK được cung cấp có xác minh trên Android hay không. Theo mặc định, điều này kiểm tra xem APK có xác minh trên tất cả các phiên bản nền tảng Android được APK hỗ trợ hay không (như đã khai báo bằng cách sử dụng minSdkVersion trong AndroidManifest.xml). Sử dụng --min-sdk-version và/hoặc --max-sdk-version để xác minh APK dựa trên phạm vi Cấp độ API tùy chỉnh.

lineage

Điều này sửa đổi khả năng của một hoặc nhiều người ký trong SigningCertificateLineage được cung cấp. Điều này có thể được sử dụng để thu hồi khả năng của chứng chỉ ký trước đó sau khi cơ sở cài đặt đã được di chuyển sang chứng chỉ ký mới.

rotate

Thao tác này lấy các khóa được cung cấp và tạo mục nhập SigningCertificateLineage liên kết khóa cũ với khóa mới, để sử dụng trong trường hợp xoay vòng khóa bằng Sơ đồ chữ ký APK v3.

version

Hiển thị số phiên bản của công cụ này và thoát

help

Hiển thị trang sử dụng này và thoát

TÙY CHỌN

-v, --verbose

Chế độ đầu ra chi tiết

-h, --help

Hiển thị trợ giúp về lệnh này và thoát

-Werr

Coi cảnh báo là lỗi

sign

Ký APK được cung cấp

--out

Tệp để xuất APK đã ký. Theo mặc định, APK được ký tại chỗ, ghi đè tệp đầu vào.

--min-sdk-version

Cấp API thấp nhất mà chữ ký của APK này sẽ được xác minh. Theo mặc định, giá trị từ AndroidManifest.xml được sử dụng. Giá trị càng cao, các tham số bảo mật càng mạnh được sử dụng khi ký.

--max-sdk-version

Cấp API cao nhất mà chữ ký của APK này sẽ được xác minh. Theo mặc định, giá trị cao nhất có thể được sử dụng.

--v1-signing-enabled

Có cho phép ký bằng sơ đồ ký JAR hay không (còn gọi là sơ đồ ký v1, sơ đồ được sử dụng trong Android kể từ ngày đầu tiên). Theo mặc định, việc ký bằng lược đồ này được bật dựa trên phiên bản SDK tối thiểu và tối đa (xem --min-sdk-version và --max-sdk-version).

--v2-signing-enabled

Có bật tính năng ký bằng Sơ đồ chữ ký APK v2 hay không (còn gọi là sơ đồ ký v2, sơ đồ được giới thiệu trong Android Nougat, API cấp 24). Theo mặc định, việc ký bằng lược đồ này được bật dựa trên phiên bản SDK tối thiểu và tối đa (xem --min-sdk-version và --max-sdk-version).

per-signer options

Các tùy chọn này chỉ định cấu hình của một người ký cụ thể. Để phân định các tùy chọn của những người ký khác nhau, hãy sử dụng --next-signer.

--next-signer

Phân định các tùy chọn của hai người ký khác nhau. Không cần sử dụng tùy chọn này khi chỉ sử dụng một người ký.

--v1-signer-name

Tên cơ sở cho các tệp bao gồm chữ ký lược đồ chữ ký JAR (còn gọi là lược đồ v1) của người ký này. Theo mặc định, bí danh khóa KeyStore hoặc tên cơ sở của tệp khóa được sử dụng.

per-signer signing key & certificate options

Có hai cách để cung cấp khóa riêng và chứng chỉ của người ký: (1) Kho khóa Java (xem --ks) hoặc (2) tệp khóa riêng ở định dạng PKCS #8 và tệp chứng chỉ ở định dạng X.509 (xem --key và --cert).

--ks

Tải khóa riêng và chuỗi chứng chỉ từ Kho khóa Java được khởi tạo từ tệp đã chỉ định. KHÔNG có nghĩa là KeyStore không cần tệp, đây là trường hợp đối với một số Kho khóa PKCS #11.

--ks-key-alias

Bí danh theo đó khóa riêng và chứng chỉ được lưu trữ trong KeyStore. Điều này phải được chỉ định nếu KeyStore chứa nhiều khóa.

--ks-pass

Mật khẩu KeyStore (xem --ks). Các định dạng sau được hỗ trợ:

  • vượt qua: mật khẩu được cung cấp nội tuyến

  • env: mật khẩu được cung cấp trong biến môi trường được đặt tên

  • tệp: mật khẩu được cung cấp trong tệp được đặt tên, dưới dạng một dòng

  • mật khẩu stdin được cung cấp trên đầu vào tiêu chuẩn, dưới dạng một dòng

Cần có mật khẩu để mở KeyStore. Theo mặc định, công cụ sẽ nhắc nhập mật khẩu thông qua bảng điều khiển hoặc đầu vào tiêu chuẩn. Khi cùng một tệp (bao gồm cả đầu vào tiêu chuẩn) được sử dụng để cung cấp nhiều mật khẩu, mật khẩu sẽ được đọc từ tệp một dòng tại một thời điểm. Mật khẩu được đọc theo thứ tự chỉ định người ký và trong mỗi người ký, mật khẩu KeyStore được đọc trước khi đọc mật khẩu khóa.

--key-pass

Mật khẩu mà khóa riêng được bảo vệ. Theo mặc định, người ta cho rằng các khóa KeyStore được bảo vệ bằng cùng một mật khẩu như KeyStore của chúng (xem --ks-pass). Các định dạng sau được hỗ trợ:

  • vượt qua: mật khẩu được cung cấp nội tuyến

  • env: mật khẩu được cung cấp trong biến môi trường được đặt tên

  • tệp: mật khẩu được cung cấp trong tệp được đặt tên, dưới dạng một dòng stdin mật khẩu được cung cấp trên đầu vào tiêu chuẩn, dưới dạng một dòng

Theo mặc định, nếu khóa được bảo vệ bằng mật khẩu, công cụ sẽ nhắc nhập mật khẩu qua bảng điều khiển hoặc đầu vào tiêu chuẩn. Khi cùng một tệp (bao gồm cả đầu vào tiêu chuẩn) được sử dụng để cung cấp nhiều mật khẩu, mật khẩu sẽ được đọc từ tệp một dòng tại một thời điểm. Mật khẩu được đọc theo thứ tự chỉ định người ký và trong mỗi người ký, mật khẩu KeyStore được đọc trước khi đọc mật khẩu khóa.

--pass-encoding

Mã hóa ký tự bổ sung (ví dụ: ibm437 hoặc utf-8) để thử mật khẩu chứa các ký tự không phải ASCII. KeyStore được tạo bởi keytool thường được mã hóa không sử dụng dạng Unicode của mật khẩu mà sử dụng dạng được tạo bằng cách mã hóa mật khẩu bằng cách sử dụng mã hóa ký tự của bảng điều khiển. apksigner theo mặc định cố gắng giải mã bằng cách sử dụng một số dạng mật khẩu: dạng Unicode, dạng được mã hóa bằng bộ ký tự mặc định của JVM và trên Java 8 trở lên, dạng được mã hóa bằng bộ ký tự của bảng điều khiển. Trên Java 9, apksigner không thể phát hiện bộ ký tự của bảng điều khiển và có thể cần được cung cấp --pass-encoding khi sử dụng mật khẩu không phải ASCII. --pass-encoding cũng có thể cần được cung cấp cho KeyStore được tạo bởi keytool trên một hệ điều hành khác hoặc ở một ngôn ngữ khác.

--ks-type

Loại/thuật toán của KeyStore để sử dụng. Theo mặc định, loại mặc định được sử dụng.

--ks-provider-name

Tên của Nhà cung cấp JCA để yêu cầu triển khai KeyStore. Theo mặc định, nhà cung cấp ưu tiên cao nhất được sử dụng. Xem --ks-provider-class để biết cách khác để chỉ định nhà cung cấp.

--ks-provider-class

Tên lớp đủ điều kiện của Nhà cung cấp JCA để từ đó yêu cầu triển khai KeyStore. Theo mặc định, nhà cung cấp được chọn dựa trên --ks-provider-name.

--ks-provider-arg

Giá trị để chuyển vào hàm tạo của lớp Nhà cung cấp JCA được chỉ định bởi --ks-provider-class. Giá trị được truyền vào hàm tạo dưới dạng java.lang.String. Theo mặc định, hàm tạo của nhà cung cấp không có đối số được sử dụng.

--key

Tải khóa riêng từ tệp được chỉ định. Nếu khóa được bảo vệ bằng mật khẩu, mật khẩu sẽ được nhắc thông qua đầu vào tiêu chuẩn trừ khi có quy định khác bằng cách sử dụng --key-pass. Tệp phải ở định dạng PKCS #8 DER.

--cert

Tải chuỗi chứng chỉ từ tệp được chỉ định. Tệp phải ở định dạng X.509 PEM hoặc DER.

verify

Kiểm tra xem APK được cung cấp có phải xác minh trên Android không

--print-certs

Hiển thị thông tin về chứng chỉ ký của APK

--min-sdk-version

Cấp API thấp nhất mà chữ ký của APK này sẽ được xác minh. Theo mặc định, giá trị từ AndroidManifest.xml được sử dụng.

--max-sdk-version

Cấp API cao nhất mà chữ ký của APK này sẽ được xác minh. Theo mặc định, giá trị cao nhất có thể được sử dụng.

VÍ DỤ

apksigner sign --ks release.jks app.apk apksigner verify --verbose app.apk 
apksigner lineage --in /path/to/existing/lineage --print-certs -v 
apksigner rotate --out /path/to/new/file --old-signer --ks release.jks --new-signer --ks release2.jks
sign
  1. Ký APK bằng khóa một và duy nhất trong keystore release.jks:

  2. apksigner sign --ks release.jks app.apk
  3. Ký APK bằng khóa riêng tư và chứng chỉ được lưu trữ dưới dạng các tệp riêng lẻ:

  4. apksigner sign --key release.pk8 --cert release.x509.pem app.apk
  5. Ký APK bằng hai phím:

  6. apksigner sign --ks release.jks --next-signer --ks magic.jks app.apk
verify
  1. Kiểm tra xem chữ ký của APK có được xác minh trên tất cả các nền tảng Android được tuyên bố là được hỗ trợ bởi APK này hay không:

  2. apksigner verify app.apk
  3. Kiểm tra xem chữ ký của APK có được xác minh trên nền tảng Android có API cấp 15 trở lên hay không:

  4. apksigner verify --min-sdk-version 15 app.apk
lineage
  1. Xóa tất cả các khả năng khỏi người ký trước đó trong lớp lót:

  2. apksigner lineage --in /path/to/existing/lineage --out /path/to/new/file --signer --ks release.jks --set-installed-data false --set-shared-uid false --set-permission false --set-rollback false --set-auth false
  1. Hiển thị chi tiết về chứng chỉ ký và khả năng của chúng trong dòng:

  2. apksigner lineage --in /path/to/existing/lineage --print-certs -v
rotate
  1. Tạo SigningCertificateLineage mới để bật xoay vòng:

  2. apksigner rotate --out /path/to/new/file --old-signer --ks release.jks --new-signer --ks release2.jks
  1. Mở rộng SigningCertificateLineage hiện có để xoay vòng lại sau lần xoay trước đó:

  2. apksigner rotate --in /path/to/existing/lineage --out /path/to/new/file --old-signer --ks release2.jks --new-signer --ks release3.jks
  1. Tạo một SigningCertificateLineage mới với các khả năng rõ ràng cho người ký trước đó:

  2. apksigner rotate --out /path/to/new/file --old-signer --ks release.jks --set-installed-data true --set-shared-uid true --set-permission true --set-rollback false --set-auth true --new-signer --ks release2.jks

XEM THÊM

signapk(1) jar(1) zip(1) zipalign(1)

https://source.android.com/devices/tech/ota/sign_builds.html

TÁC GIẢ

Dự án mã nguồn mở Android.