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

デモのお申し込み

[TECH] apksignerを使用した署名とAPK Signature Scheme v2

本記事では、apksignerとzipalignを使用して、手動でAndroid APKファイルにAPK Signature Scheme v2で署名する方法について説明します。

[TECH] apksignerを使用した署名とAPK Signature Scheme v2

 

前回の記事(ANDROID APP SIGNING & ZIPALIGN)では、APK Signature Scheme v1を使用して、jarsignerを使ったAPKおよびAABファイルの署名方法について説明しました。
今回は、apksignerを使用したAPKの署名方法について解説します。

「jarsignerを使って署名できるのに、なぜapksignerを使う必要があるのか?」と疑問に思うかもしれません。

APK Signature Scheme v2は、Android 7.0で導入され、APKファイルの保護を強化しました。
その後、Android 9.0でAPK Signature Scheme v3が、Android 11.0でAPK Signature Scheme v4が導入されました。

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

APK Signature Scheme v2が導入される前は、jarsignerを使用したSigned JAR方式で署名されていました。
しかし、APK Signature Scheme v2以降は、apksignerを使用するようになりました。

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



1) アプリのビルド時にSignature Versions v2オプションが選択された場合(APK Signature Scheme v2)
2) アプリのtargetSdkVersionが30以上に設定されている場合

上記の場合、apksignerでの署名が必須となります。
jarsignerを使ってもアプリのインストールや実行に問題はありませんが、Google Play Consoleへアップロードする際にエラーが発生する可能性があります。

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

1. Android Studioで確認する
 
「Generate Signed Bundle or APK」の設定画面で「V2 (Full APK Signature)」にチェックが入っている場合、V2バージョンであることを意味します。
 
signature version select in Androidstudio
 
 
2. コマンドで確認する
 
java -jar [apksigner.jar Path] verify -v --print-certs [Apk’s Path before applying LIAPP]
 
Ex) C:\>java -jar D:\android\sdk\build-tools\28.0.0\lib\apksigner.jar verify -v --print-certs C:\app-release.apk

このコマンドの結果で、「Verified using v2 scheme (APK Signature Scheme v2) : true」と表示されればV2、「false」と表示されればV1であることを意味します。
 
 

zipalign

 

重要なポイントとして、apksignerを使用する場合、zipalignはAPKファイルの署名前に実行する必要があります。

APKファイルをapksignerで署名した後に変更を加えると、署名が無効化されます。
そのため、必ずzipalignを署名前に実行してください。

zipalign -f -v 4 "zipalign前のAPKファイルのパス""zipalign後のAPKファイルの保存先"
 
zipalign command in windows cmd
 
 

Signing with apksigner

 
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_PATH] は、apksigner が存在する場所です。
apksigner ツールは、Android SDK Build Tools のバージョン 24.0.3 以降で利用可能です。
以下の方法で確認できます。

1) Check SDK path in the Android Studio
Tool menu => SDK Manager => Android SDK Location path check
2) Check Apksigner file from the SDK directory
SDK Directory => build-tools directory =>buildToolsVersion directory =>lib directory =>check apksigner.jar file
In case of MAC, check apksigner file from the buildToolsVersion directory
 
コマンドを実行すると、キーストアのパスワードを入力するように求めるメッセージが表示されます。

Keystore password for signer #1:

キーストアのパスワードを入力する際、パスワードの文字は画面に表示されませんが、実際には入力されています。正しいキーストアのパスワードが入力されると、次のステップに進むことができます。キーストアのパスワードとキーパスワードが同じ場合、署名はすぐに進行します。キーストアのパスワードとキーパスワードが異なる場合は、キーパスワードを入力するように求められます。

Key "KEY_NAME" password for signer #1:

正しいキーパスワードが入力されると、署名が進行し、署名が完了すると「Signed.」というメッセージが表示されます。
 
apksigner command in windows cmd
 
 
コマンドラインで –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]
 

Verify Signing

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

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

署名が正常に機能している場合、以下のように「Verified using v2 scheme (APK Signature Scheme v2): true」と表示されます。
 
verify signing command in windows cmd
 
 
 

zipalign & Signing with script file

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

[ Bat file for Window users]

[ Sh file for MAC users]

ファイルをダウンロードしたら、メモ帳やテキストエディタで開き、以下の内容を編集して保存してください。

KeyStorePath="Keystore Path"
ALIAS_NAME="Alias Name"
STORE_PASS="Keystore Password"
KEY_PASS="Key Password"
ZIP_ALIGN="zipalign file path"
APKSIGNER_PATH="apksigner file path"

zipalign と apksigner のファイルは、Android SDK がインストールされているパスの build-tools フォルダ内にあります。 パスワードを保存せずに入力したい場合は、--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
 
「Permission denied」というメッセージがMacに表示された場合、以下のように実行権限を付与できます。

Ex. chmod +x /Users/username/Downloads/LIAPP_apksign_mac.sh

正常に実行されると、最初に zipalign が実行され、その後署名が行われます。 署名プロセス中に「Signed.」というメッセージが確認され、問題がなければ、署名を続行するために任意のキーを押してください。 完了したファイルは、ファイル名の後に _signed が追加されて保存されます。

apksigner と APK Signature Scheme を使用した署名に関する詳細については、以下の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