開発者じゃなくてもたった10秒で保安の心配無用! 

デモのお申し込み

[TECH] apksigner と APK 署名スキーム v2 を使用した署名

これは、apksigner と zipalign を使用して、APK 署名スキーム v2 署名システム用に Android APK ファイルを手動で署名する方法を説明するガイドです。

[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 が導入されました。

 
Google による署名検証プロセス
 
 

APK 署名スキーム v2 以前は、署名は jarsigner を使用して署名された JAR に基づいていましたが、v2 以降は apksigner に基づいて行われるようになりました。

では、どのような場合に apksigner を使用して署名するのでしょうか?


1) アプリのビルド時に署名バージョン v2 オプションを選択した場合。(APK 署名スキーム v2)

2) アプリのビルド時に targetSdkVersion が 30 より高く設定された場合


上記の場合は、apksigner を使用して署名する必要があります。

jarsigner を使用して署名すると、アプリのインストールと実行に大きな問題はありませんが、Google Play Console にアプリをアップロードするときにエラーが発生する可能性があります。

 

アプリの署名スキーム バージョンを確認する方法

 
1. Android Studio から確認する
 
「署名済みバンドルまたは APK の生成」で「V2 (完全な APK 署名)」がチェックされている場合は、V2 バージョンです
 
Android Studio で署名バージョンを選択
 
 
2. コマンドから確認する
 
java -jar [apksigner.jar パス] verify -v --print-certs [LIAPP を適用する前の Apk のパス]
 
例) C:\>java -jar D:\android\sdk\build-tools\28.0.0\lib\apksigner.jar verify -v --print-certs C:\app-release.apk

「v2 スキームを使用して検証済み (APK 署名スキーム v2)」が true の場合は V2、false の場合は V1 です。
 
 

zipalign

 
重要な点は、apksigner を使用する場合、zipalign は APK ファイルが署名される前にのみ実行する必要があることです。
apksigner を使用して APK に署名し、さらに APK に変更を加えると、署名は無効になります。
したがって、zipalign は apk に署名する前にのみ実行する必要があります。

zipalign -f -v 4 "zipalign が必要な apk ファイル パス" "zipalign 後に保存される apk ファイル パス"
 
Windows cmd での zipalign コマンド
 
 

apksigner による署名

 
以下のように、完成した zipalign ファイルに 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_PATH] は apksigner が配置されている場所です。
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」パスワード:

正しいキー パスワードを入力すると、署名が続行され、署名が完了すると「署名済み」と表示されます。
 
Windows cmd の apksigner コマンド
 
 

コマンド ラインで –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]
 

署名の確認

 
apksigner による署名が適切に適用されているかどうかを確認するには、以下のコマンドを使用します。

[ Windows ]
java -jar [APKSIGNER_PATH] verify -v --print-certs [APP_FILE_PATH]
[ MAC ]
[APKSIGNER_PATH] verify -v --print-certs [APP_FILE_PATH]

署名が正しく機能する場合は、「v2 を使用して検証済み」をチェックできます。
 
Windows cmd で署名コマンドを検証
 
 
 

zipalign とスクリプト ファイルによる署名

apksigner で署名する方法を説明しました。
このプロセスを簡単に進めるために、スクリプト ファイルを共有しています。

[ 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
 
Mac で「権限が拒否されました」というメッセージが表示されたら、以下のように実行権限を与えることができます。

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