
[TECH] apksigner と APK 署名スキーム v2 を使用した署名
前回の投稿 (ANDROID APP SIGNING & ZIPALIGN) では、APK 署名スキーム v1 を使用して apk および aab ファイルに jarsigner で署名する方法について説明しました。
この投稿では、apksigner を使用して apk ファイルに署名する方法について説明します。
jarsigner を使用できるのに、なぜ apksigner を使用した署名について知っておく必要があるのかと疑問に思うかもしれません。
APK 署名スキーム v2 は、apk ファイルをより安全に保護するために Android 7.0 で導入されました。
その後、Android 9.0 で APK 署名スキーム v3 が導入され、Android 11.0 で APK 署名スキーム v4 が導入されました。

APK 署名スキーム v2 以前は、署名は jarsigner を使用して署名された JAR に基づいていましたが、v2 以降は apksigner に基づいて行われるようになりました。
では、どのような場合に apksigner を使用して署名するのでしょうか?
1) アプリのビルド時に署名バージョン v2 オプションを選択した場合。(APK 署名スキーム v2)
2) アプリのビルド時に targetSdkVersion が 30 より高く設定された場合
上記の場合は、apksigner を使用して署名する必要があります。
jarsigner を使用して署名すると、アプリのインストールと実行に大きな問題はありませんが、Google Play Console にアプリをアップロードするときにエラーが発生する可能性があります。
アプリの署名スキーム バージョンを確認する方法
「署名済みバンドルまたは APK の生成」で「V2 (完全な APK 署名)」がチェックされている場合は、V2 バージョンです

java -jar [apksigner.jar パス] verify -v --print-certs [LIAPP を適用する前の Apk のパス]
「v2 スキームを使用して検証済み (APK 署名スキーム v2)」が true の場合は V2、false の場合は V1 です。
zipalign
apksigner を使用して APK に署名し、さらに APK に変更を加えると、署名は無効になります。
したがって、zipalign は apk に署名する前にのみ実行する必要があります。
zipalign -f -v 4 "zipalign が必要な apk ファイル パス" "zipalign 後に保存される apk ファイル パス"

apksigner による署名
[ Windows ]
java -jar [APKSIGNER_PATH] sign -v --out [SAVED_APK_PATH] --ks [KEYSTORE_PATH] --ks-key-alias [ALIAS_NAME] [APK_FILE_PATH]
[ MAC ]
[APKSIGNER_PATH] sign -v --out [SAVED_APK_PATH] --ks [KEYSTORE_PATH] --ks-key-alias [ALIAS_NAME] [APK_FILE_PATH]
apksigner ツールは、Android SDK ビルド ツールのリビジョン 24.0.3 以降で使用可能で、以下のように確認できます。
1) Android Studio で SDK パスを確認します
ツール メニュー => SDK マネージャー => Android SDK ロケーション パスを確認します
2) SDK ディレクトリから Apksigner ファイルを確認します
SDK ディレクトリ => build-tools ディレクトリ => buildToolsVersion ディレクトリ => lib ディレクトリ => apksigner.jar ファイルを確認します
MAC の場合は、buildToolsVersion ディレクトリから apksigner ファイルを確認します
署名者 #1 のキーストア パスワード:
キーストア パスワードを入力すると、パスワード文字は画面に表示されませんが、実際には入力されます。
正しいキーストア パスワードを入力すると、次の手順に進むことができます。
キーストア パスワードとキー パスワードが同一の場合、署名はすぐに続行されます。
キーストア パスワードとキー パスワードが異なる場合、キー パスワードの入力を求められます。
署名者 #1 のキー「KEY_NAME」パスワード:
正しいキー パスワードを入力すると、署名が続行され、署名が完了すると「署名済み」と表示されます。

コマンド ラインで –ks-pass pass: および –key-pass:pass オプションを使用すると、事前にパスワードを設定してコマンドを実行できます。
このオプションを使用すると、パスワードを入力するメッセージは表示されず、自動的に入力されます。
[ Windows ]
java -jar [APKSIGNER_PATH] sign -v --out [SAVED_APK_PATH] --ks [KEYSTORE_PATH] --ks-pass pass:"keystore_password" --key-pass pass:"key_password" --ks-key-alias [ALIAS_NAME] [APP_FILE_PATH]
[ MAC ]
[APKSIGNER_PATH] sign -v --out [SAVED_APK_PATH] --ks [KEYSTORE_PATH] --ks-pass pass:"keystore_password" --key-pass pass:"key_password" --ks-key-alias [ALIAS_NAME] [APP_FILE_PATH]
署名の確認
[ Windows ]
java -jar [APKSIGNER_PATH] verify -v --print-certs [APP_FILE_PATH]
[ MAC ]
[APKSIGNER_PATH] verify -v --print-certs [APP_FILE_PATH]
署名が正しく機能する場合は、「v2 を使用して検証済み」をチェックできます。

zipalign とスクリプト ファイルによる署名
このプロセスを簡単に進めるために、スクリプト ファイルを共有しています。
[ Window ユーザー向けの Bat ファイル]
[ MAC ユーザー向けの Sh ファイル ]
ファイルをダウンロードしたら、メモ帳またはテキスト エディターで開きます。以下の内容を編集したら保存します。
KeyStorePath="キーストア パス"
ALIAS_NAME="エイリアス名"
STORE_PASS="キーストア パスワード"
KEY_PASS="キー パスワード"
ZIP_ALIGN="zipalign ファイル パス"
APKSIGNER_PATH="apksigner ファイル パス"
zipalign ファイルと apksigner ファイルは、Android SDK がインストールされているパスのビルド ツールにあります。
保存せずに独自のパスワードを入力する場合は、--ks-pass および --key-pass 関連のオプションを削除する必要があります。
Windows ユーザーは、アプリをドラッグできます。署名するファイルを LIAPP_sign_window.bat ファイルにコピーすると、すぐに実行されます。
MAC ユーザーは、スクリプト ファイルとアプリ ファイルを順番にドラッグするか、以下に示すようにパスを入力することで、ターミナル プログラムを実行できます。
Ex. /Users/username/Downloads/LIAPP_apksign_mac.sh /Users/username/AndroidStudioProjects/MyApplication/app/release/app-release.apk
Ex. chmod +x /Users/username/Downloads/LIAPP_apksign_mac.sh
正常に実行されると、まず zipalign が実行され、次に署名が行われます。
署名プロセス中に問題なく「署名されました。」というメッセージを確認したら、任意のキーを押して署名を続行します。
完了したファイルは、ファイル名の後に _signed が付いて保存されます。
apksigner と APK 署名スキームを使用した署名の詳細については、以下の URL を参照してください。
apksigner : https://developer.android.com/studio/command-line/apksigner
app-signing : https://developer.android.com/studio/publish/app-signing
APK Signature Scheme : https://source.android.com/security/apksigning
LIAPP は、可能な限り最高のサービスを提供します。
#android_application_security #ios_application_security #ios_application_security #source_code_hardening #android_app_bundle #AAB #APK #Android App Bundle #mobile_application_security #mobile_game_security #source_code_security #Anti-tampering #anti_memory_dump #anti_malware #detecting_hacktools #anti_repackaging