Android SDK Build Tools のリビジョン 24.0.3 以上で利用可能な apksigner
ツールを使用すると、APK に署名し、その APK がサポートする Android プラットフォームのすべてのバージョンで APK の署名が正常に検証されることを確認できます。このページは、このツールの使い方について簡単に説明するガイドであり、このツールがサポートするさまざまなコマンドライン オプションのリファレンスとしても参照できます。apksigner
ツールを使って APK に署名する方法についての全詳細は、アプリの署名のガイドをご覧ください。
注意: apksigner
を使用して APK に署名した後で APK にさらに変更を加えると、APK の署名は無効になります。そのため、zipalign
のようなツールは APK に署名する前に実行する必要があります。
使い方
APK に署名する
apksigner
ツールを使用して APK に署名するための構文は次のとおりです。
apksigner sign --ks keystore.jks | --key key.pk8 --cert cert.x509.pem [signer_options] app-name.apk
apksigner
ツールを使用して APK に署名する場合、その署名者の秘密鍵と証明書を指定する必要があります。この情報を指定する方法は 2 つあります。
--ks
オプションを使用してキーストア ファイルを指定します。--key
オプションと--cert
オプションを使用して、それぞれ秘密鍵ファイルと証明書ファイルを別個に指定します。秘密鍵ファイルには PKCS#8 形式を使用し、証明書ファイルには X.509 形式を使用する必要があります。
通常は 1 つの APK の署名に指定する署名者は 1 人です。複数の署名者を指定して APK に署名する必要がある場合は、--next-signer
オプションを使って、各署名者に適用する全般オプションのセットを区切ります。
apksigner sign [signer_1_options] --next-signer [signer_2_options] app-name.apk
APK の署名を検証する
サポートしているプラットフォーム上で APK の署名が正常に検証されるかどうかを確かめるには、次の構文を使用します。
apksigner verify [options] app-name.apk
署名鍵をローテートする
署名証明書の系列、つまり署名の新しいシーケンスをローテートするには、次の構文を使用します。
$ apksigner rotate --in /path/to/existing/lineage \ --out /path/to/new/file \ --old-signer --ks old-signer-jks \ --new-signer --ks new-signer-jks
オプション
apksigner
ツールがサポートする各コマンドのオプションのセットを、次のリストに示します。
署名コマンド
全般オプション
以下のオプションでは、署名者に適用する基本設定を指定します。
--out <apk-filename>
- 署名した APK を保存する場所です。このオプションを明示的に指定しない場合、APK パッケージはその場で署名され、入力 APK ファイルが上書きされます。
--min-sdk-version <integer>
- APK の署名が検証されることを確認するために
apksigner
が使用する Android Framework API の最低レベルです。値が大きいほど、ツールでのアプリの署名に使用できるセキュリティ パラメータの強度が高くなりますが、APK を利用できるデバイスは Android のバージョンが新しいものに限定されます。デフォルトでは、apksigner
はアプリのマニフェスト ファイル内のminSdkVersion
属性の値を使用します。 --max-sdk-version <integer>
- APK の署名が検証されることを確認するために
apksigner
が使用する Android Framework API の最高レベルです。デフォルトでは、このツールで可能な API の最高レベルを使用します。 --v1-signing-enabled <true | false>
- 指定した APK パッケージに
apksigner
が署名する際に、従来の JAR ベースの署名スキームを使用するかどうかを指定します。デフォルトでは、このツールは--min-sdk-version
と--max-sdk-version
の値から、この署名スキームをいつ適用するかを決めます。 --v2-signing-enabled <true | false>
- 指定した APK パッケージに
apksigner
が署名する際に、APK 署名スキーム v2 を使用するかどうかを指定します。デフォルトでは、このツールは--min-sdk-version
と--max-sdk-version
の値から、この署名スキームをいつ適用するかを決めます。 -v
、--verbose
- 詳細出力モードを使用します。
署名者ごとのオプション
以下のオプションでは、1 人の特定の署名者の設定を指定します。1 人の署名者だけがアプリに署名する場合、これらのオプションは必要ありません。
--next-signer <signer-options>
- 署名者ごとに異なる全般オプションを指定するのに使用します。
--v1-signer-name <basename>
- 現在の署名者の JAR ベース署名を構成するファイルのベース名です。デフォルトでは、
apksigner
はキーストアのキーエイリアスか、この署名者のキーファイルのベース名を使用します。
鍵と証明書のオプション
以下のオプションでは、署名者の秘密鍵と証明書を指定します。
--ks <filename>
- 指定する Java ベースのキーストア ファイル内に、署名者の秘密鍵と証明書チェーンがあります。ファイル名を
"NONE"
に設定する場合、その鍵と証明書を含むキーストアにはファイルの指定が不要です。これは、一部の PKCS #11 が該当します。 --ks-key-alias <alias>
- キーストア内で、その署名者の秘密鍵と証明書のデータを示すエイリアス名です。署名者に関連付けられているキーストアに複数の鍵が含まれている場合、このオプションを指定する必要があります。
--ks-pass <input-format>
-
署名者の秘密鍵と証明書が含まれているキーストアのパスワードです。キーストアを開くためにパスワードを指定する必要があります。
apksigner
ツールでは、以下の形式がサポートされています。-
pass:<password>
-apksigner sign
コマンドの他の部分と一緒にパスワードをインラインで指定します。 -
env:<name>
- 指定する環境変数にパスワードを保存します。 -
file:<filename>
- 指定するファイル内にパスワードを 1 行で保存します。 -
stdin
- 標準の入力ストリーム内にパスワードを 1 行で指定します。これは--ks-pass
のデフォルトです。
注: 同じファイルに複数のパスワードを含める場合は、別々の行に指定します。
apksigner
ツールは、署名者が指定された順序に基づいて、パスワードと APK の署名者を関連付けます。1 人の署名者に 2 つのパスワードを指定した場合、apksigner
は最初のパスワードをキーストアのパスワード、2 番目のパスワードを鍵のパスワードと解釈します。 -
--pass-encoding <charset>
- 非 ASCII 文字が含まれるパスワードを処理する際の文字エンコード(
ibm437
、utf-8
など)を指定します。Keytool は多くの場合、コンソールのデフォルトの文字セットを使用してパスワードを変換することにより、キーストアを暗号化します。デフォルトでは、
apksigner
はパスワードの複数の形式を使って復号を試みます。使用するのは、Unicode 形式、JVM のデフォルト文字セットを使ってエンコードされた形式、および Java 8 以前でコンソールのデフォルト文字セットを使用してエンコードされた形式です。Java 9 では、apksigner
はコンソールの文字セットを検出できません。そのため、非 ASCII パスワードを使用する場合は--pass-encoding
の指定が必要になることがあります。また、異なる OS 上または異なるロケールで Keytool が作成したキーストアの場合も、このオプションの指定が必要になることがあります。 --key-pass <input-format>
-
署名者の秘密鍵のパスワードです。これは、秘密鍵がパスワードで保護されている場合に必要です。
apksigner
ツールでは、以下の形式がサポートされています。-
pass:<password>
-apksigner sign
コマンドの他の部分と一緒にパスワードをインラインで指定します。 -
env:<name>
- 指定する環境変数にパスワードを保存します。 -
file:<filename>
- 指定するファイル内にパスワードを 1 行で保存します。 -
stdin
- 標準の入力ストリーム内にパスワードを 1 行で指定します。これは--key-pass
のデフォルトです。
注: 同じファイルに複数のパスワードを含める場合は、別々の行に指定します。
apksigner
ツールは、署名者が指定された順序に基づいて、パスワードと APK の署名者を関連付けます。1 人の署名者に 2 つのパスワードを指定した場合、apksigner
は最初のパスワードをキーストアのパスワード、2 番目のパスワードを鍵のパスワードと解釈します。 -
--ks-type <algorithm>
- 署名者の秘密鍵と証明書が含まれているキーストアに関連付けられているタイプまたはアルゴリズムです。デフォルトでは
apksigner
は、セキュリティ プロパティ ファイル内のkeystore.type
定数として定義されているタイプを使用します。 --ks-provider-name <name>
- 署名者のキーストアの実装をリクエストするときに使用する JCA プロバイダの名前です。デフォルトでは
apksigner
は優先順位の最も高いプロバイダを使用します。 --ks-provider-class <class-name>
- 署名者のキーストアの実装をリクエストするときに使用する JCA プロバイダの完全修飾クラス名です。このオプションは
--ks-provider-name
の代わりとなります。デフォルトではapksigner
は、--ks-provider-name
オプションで指定されたプロバイダを使用します。 --ks-provider-arg <value>
- JCA プロバイダ クラスのコンストラクタの引数として渡す文字列です。クラスそのものは
--ks-provider-class
オプションを使って定義します。デフォルトではapksigner
はそのクラスの 0 引数コンストラクタを使用します。 --key <filename>
- 署名者の秘密鍵を含むファイルの名前です。このファイルは PKCS#8 DER 形式を使用する必要があります。鍵がパスワードで保護されている場合、
--key-pass
オプションで別の種類の入力形式が指定されていなければ、apksigner
は標準入力を使ってパスワードの入力を求めます。 --cert <filename>
- 署名者の証明書チェーンが含まれるファイルの名前です。このファイルは、X.509 PEM 形式または DER 形式を使用する必要があります。
検証コマンド
--print-certs
- APK の署名証明書に関する情報を表示します。
--min-sdk-version <integer>
- APK の署名が検証されることを確認するために
apksigner
が使用する Android Framework API の最低レベルです。値が大きいほど、ツールでのアプリの署名に使用できるセキュリティ パラメータの強度が高くなりますが、APK を利用できるデバイスは Android のバージョンが新しいものに限定されます。デフォルトでは、apksigner
はアプリのマニフェスト ファイル内のminSdkVersion
属性の値を使用します。 --max-sdk-version <integer>
- APK の署名が検証されることを確認するために
apksigner
が使用する Android Framework API の最高レベルです。デフォルトでは、このツールで可能な API の最高レベルを使用します。 -v
、--verbose
- 詳細出力モードを使用します。
-Werr
- 警告をエラーとして扱います。
例
APK に署名する
キーストア内の唯一の鍵である release.jks
を使って、APK に署名します。
$ apksigner sign --ks release.jks app.apk
別々のファイルに保存されている秘密鍵と証明書を使って、APK に署名します。
$ apksigner sign --key release.pk8 --cert release.x509.pem app.apk
2 つの鍵を使って、APK に署名します。
$ apksigner sign --ks first-release-key.jks --next-signer --ks second-release-key.jks app.apk
APK の署名を検証する
APK がサポートするすべての Android プラットフォームで、APK の署名の有効性が検証されると想定できるかどうかを確認します。
$ apksigner verify app.apk
Android 4.0.3(API レベル 15)以上で APK の署名の有効性が検証されると想定できるかどうかを確認します。
$ apksigner verify --min-sdk-version 15 app.apk
署名鍵をローテートする
鍵のローテーションをサポートする署名証明書の系列を有効にします。
$ apksigner rotate --out /path/to/new/file --old-signer \ --ks release.jks --new-signer --ks release2.jks
署名鍵を再度ローテートします。
$ apksigner rotate --in /path/to/existing/lineage \ --out /path/to/new/file --old-signer --ks release2.jks \ --new-signer --ks release3.jks