[TECH] apksigner를 이용한 서명과 APK Signature scheme v2
이전 포스트에서 ( 바로가기 ) jarsigner를 이용하여 apk와 aab 파일에 APK Signature Scheme v1을 이용하여 서명하는 방법에 대해서 이야기 하였습니다.
이번 포스트에서는 apksigner를 이용하여 apk 파일에 서명하는 방법에 대해 이야기 하고자 합니다.
이번 포스트에서는 apksigner를 이용하여 apk 파일에 서명하는 방법에 대해 이야기 하고자 합니다.
jarsigner를 통해 apk에 서명을 할 수 있는데 왜 apksigner를 이용한 서명 방법을 알아야 할까요?
Android가 7.0으로 업데이트 될 때 APK 파일을 더욱 강력하게 보호해 주는 APK Signature Scheme v2가 도입되었습니다.
이후 Android 9에 APK Signature Scheme v3가 도입되었고 Android 11에서는 APK Signature Scheme v4가 도입되었습니다.
이후 Android 9에 APK Signature Scheme v3가 도입되었고 Android 11에서는 APK Signature Scheme v4가 도입되었습니다.
signature verification process by google
APK Signature Scheme v2 이전에는 Signed JAR에 기반한 서명 체계로 jarsigner를 사용하였으며, v2 부터 apksigner를 이용한 서명 체계를 사용하게 되었습니다.
그럼 어떤 경우에 apksigner를 이용하여 서명을 해야 할까요?
위와 같은 경우에는 반드시 apksigner를 이용해 서명을 해야 합니다.
jarsigner로 서명을 해도 설치하고 실행하는데는 큰 문제가 없지만 Google Play Console 에 업로드 시 에러가 발생할 수 있습니다.
그럼 어떤 경우에 apksigner를 이용하여 서명을 해야 할까요?
1) 앱 빌드 시 Signature Versions v2 옵션이 선택된 경우( APK Signature Scheme v2 )
2) 앱 빌드 시 targetSdkVersion을 30 이상으로 설정한 경우
위와 같은 경우에는 반드시 apksigner를 이용해 서명을 해야 합니다.
jarsigner로 서명을 해도 설치하고 실행하는데는 큰 문제가 없지만 Google Play Console 에 업로드 시 에러가 발생할 수 있습니다.
앱의 Signature Scheme 버전 확인 방법
1. Android studio에서 확인
'Generate Signed Bundle or APK'에 'V2 (Full APK Signature)'가 체크되어 있으면 V2 버전
signature version select in Androidstudio
2. Command에서 확인
java -jar [apksigner.jar Path] verify -v --print-certs [LIAPP 적용하기 전 Apk의 Path]
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 버전
만약 Verified using v2 scheme (APK Signature Scheme v2): true = V2 버전, false = V1 버전
zipalign
apksigner로 서명할 때 주의할 점은 zipalign을 먼저 진행한 후 signing을 해야하는 점입니다.
apksigner를 사용하여 APK에 서명한 후 APK 파일에 변경사항이 생기면 서명이 무효화됩니다.
따라서 APK에 서명을 하기 전에 zipalign을 진행해야 합니다.
apksigner를 사용하여 APK에 서명한 후 APK 파일에 변경사항이 생기면 서명이 무효화됩니다.
따라서 APK에 서명을 하기 전에 zipalign을 진행해야 합니다.
zipalign -f -v 4 "zipalign이 필요한 apk 파일 Path" "zipalign 후 저장될 apk 파일 Path"
zipalign command in windows cmd
Signing with 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는 버전 24.0.3 이상의 Android SDK Build Tools에서 제공하는 도구로 아래와 같이 확인이 가능합니다.
apksigner는 버전 24.0.3 이상의 Android SDK Build Tools에서 제공하는 도구로 아래와 같이 확인이 가능합니다.
1) Android Studio에서 SDK 경로 확인
Tools 메뉴 => SDK Manager => Android SDK Location 경로 확인
2) SDK 디렉토리에서 apksigner 파일 확인
SDK 디렉토리 => build-tools 디렉토리 => buildToolsVersion 디렉토리 => lib 디렉토리 => apksigner.jar 파일 확인
*MAC의 경우 buildToolsVersion 디렉토리에서 apksigner 파일 확인
명령을 실행하면 키스토어의 암호를 입력하라는 메시지가 표시됩니다.
Keystore password for signer #1:
키스토어 암호를 입력 시 키보드로 입력하는 문자가 화면에 표시되지는 않지만 실제로는 입력됩니다.
올바른 키스토어 암호가 입력되면 다음 단계로 진행합니다.
이때 키스토어 암호와 키 암호가 같으면 바로 서명이 진행됩니다.
만약 키스토어 암호와 키 암호가 다르면 키 암호를 입력하라는 메시지가 표시됩니다.
Key "KEY_NAME" password for signer #1:
올바른 키 암호가 입력되면 서명이 진행되고 서명이 완료되면 "Signed"가 표시됩니다.
apksigner command in windows cmd
해당 옵션을 사용하면 암호를 입력하라는 메시지가 표시되지 않고 자동으로 입력됩니다.
[ Windows ]
java -jar [APKSIGNER_PATH] sign -v --out [SAVED_APK_PATH] --ks [KEYSTORE_PATH] --ks-pass pass:"키스토어_암호" --key-pass pass:"키_암호" --ks-key-alias [ALIAS_NAME] [APP_FILE_PATH]
[ MAC ]
[APKSIGNER_PATH] sign -v --out [SAVED_APK_PATH] --ks [KEYSTORE_PATH] --ks-pass pass:"키스토어_암호" --key-pass pass:"키_암호" --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를 이용한 서명 방법을 알아보았습니다.
이 과정을 조금 더 쉽게 진행할 수 있도록 스크립트 파일 공유해드립니다.
다운받은 파일을 메모장이나 텍스트 편집기로 열고 아래의 내용을 수정한 후 저장합니다.
이 과정을 조금 더 쉽게 진행할 수 있도록 스크립트 파일 공유해드립니다.
[ Windows 사용자 용 bat 파일]
[ MAC 사용자 용 sh 파일]
다운받은 파일을 메모장이나 텍스트 편집기로 열고 아래의 내용을 수정한 후 저장합니다.
KeyStorePath="키스토어 경로"
ALIAS_NAME="alias 이름"
STORE_PASS="키스토어 암호"
KEY_PASS="키 암호"
ZIP_ALIGN="zipalign 파일의 경로"
APKSIGNER_PATH="apksigner 파일의 경로"
zipalign 파일과 apksigner 파일은 Android SDK가 설치된 경로의 build-tools에 위치하고 있습니다.
만약 암호를 저장하지 않고 직접 입력하기를 원하시는 경우 --ks-pass와 --key-pass 관련 옵션을 제거하면 됩니다.
Windows 사용자는 서명할 앱 파일을 LIAPP_apksign_windows.bat 파일에 drag하면 바로 실행됩니다.
MAC 사용자는 터미널 프로그램을 실행한 후 스크립트 파일과 앱 파일을 차례로 drag 하거나 아래와 같이 경로를 입력하고 실행합니다.
예 : /Users/username/Downloads/LIAPP_apksign_mac.sh /Users/username/AndroidStudioProjects/MyApplication/app/release/app-release.apk
MAC에서 실행 시 "Permission denied"라는 메시지가 표시되는 경우 아래와 같이 실행권한을 부여한 후 실행합니다.
예 : 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 #모바일_앱_보안 #앱_보안_서비스 #게임_보안_서비스 #소스코드_보호 #난독화 #소스코드_보안 #앱_위변조_방지 #메모리_덤프_방지 #악성코드_탐지 #해킹툴_탐지 #리패키징_방지 #메모리_보안