[TECH] ANDROID APP SIGNING & ZIPALIGN

ANDROID APP SIGNING & ZIPALIGN - jarsigner를 이용하여 Android APK와 AAB(ANDROID APP BUNDLE) 파일에 수동으로 서명하는 방법과 zipalign 하는 방법에 관하여 설명합니다.

 
 

[TECH] ANDROID APP SIGNING & ZIPALIGN

 
 
안드로이드 앱은 여러 종류의 programming language와 개발 프로그램을 이용하여 만들 수 있습니다.
이렇게 만들어진 안드로이드 앱은 다양한 경로를 통해 배포가 이루어지며 안드로이드 기기에 설치됩니다.
 
안드로이드 앱이 완성되기 위해서는 반드시 앱 제작자를 식별할 수 있는 서명이 필요합니다.
 
일반적으로 개발 프로그램에서 이 과정을 자동으로 진행하기 때문에 별도의 작업을 필요로 하지 않습니다. 그러나, 앱에 LIAPP과 같은 보안 서비스를 적용하는 경우 앱 패키지가 변경되어 수동으로 서명을 진행하여야 합니다.
 
 
sign your app by google
 
 

Signing with jarsigner


안드로이드 앱의 서명은 apksigner 또는 jarsigner를 이용하여 할 수 있습니다.
apksigner는 버전 24.0.3 이상의 Android SDK Build Tools에서 제공하는 도구이며 apk 파일에만 서명이 가능합니다.
jarsigner는 Java에 포함되어 있는 도구이며 apk와 aab(Android App Bundle) 파일 모두 서명이 가능합니다.

본 블로그에서는 jarsigner를 이용한 서명 방법을 알아보겠습니다.
 
[준비 사항]
- JAVA ( jarsigner )
- Key file ( .keystore or .jks )
- Key file 생성 시 설정했던 alias 와 PassPhrase ( password )
 
jarsigner를 이용하는 방법은 Windows의 cmd나 Mac의 터미널과 같은 프로그램에서 아래와 같은 형식의 command line을 입력하는 방식으로 간단히 적용하실 수 있습니다.
 
[ APK ]
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore "KEYSTORE_PATH" "APP_FILE_PATH" "ALIAS_NAME"

[ AAB ]
jarsigner -verbose -sigalg SHA256withRSA -digestalg SHA-256 -keystore "KEYSTORE_PATH" "APP_FILE_PATH" "ALIAS_NAME"
 
여기서 우리가 집중해야 할 부분은 큰따옴표(")로 표시되어 있는 부분입니다.
 
[ KEYSTORE_PATH ]
- keystore의 경로를 입력합니다.
- 보통 .keystore 혹은 .jks의 확장자를 가지고 있는 경우가 많습니다.
* Android Studio에서 keystore 확인 방법
Build 메뉴 => Generate Signed Bundle / APK => Android Aap Bundle 혹은 APK 선택 => Key store path 확인
* Unity에서 keystore 확인 방법
File 메뉴 => Build Settings => Player Settings => Publishing Settings => Path 확인 => 확인된 이름으로 파일 위치 검색

[ APP_FILE_PATH ]
- 서명할 앱 파일의 경로를 입력합니다.

[ ALIAS_NAME ]
- key를 만들때 생성했던 Alias 이름을 입력합니다.
* Android Studio에서 Alias 확인 방법
Build 메뉴 => Generate Signed Bundle / APK 선택 => Android Aap Bundle 혹은 APK 선택 => Key alias 확인
* Unity에서 Alias 확인 방법
File 메뉴 => Build Settings => Player Settings => Publishing Settings => Alias 확인
 
명령을 실행하면 키스토어의 암호를 입력하라는 메시지가 표시됩니다.
 
Enter Passphrase for keystore:
 
키스토어 암호를 입력 시 키보드로 입력하는 문자가 화면에 표시되지는 않지만 실제로는 입력됩니다.
만약 잘못된 암호를 입력하게 되면 아래와 같은 에러메시지가 표시됩니다.
 
jarsigner error: java.lang.RuntimeException: keystore load: Keystore was tampered with, or password was incorrect
 
올바른 키스토어 암호가 입력되면 다음 단계로 진행합니다.
이때 키스토어 암호와 키 암호가 같으면 바로 서명이 진행됩니다.
만약 키스토어 암호와 키 암호가 다르면 키 암호를 입력하라는 메시지가 표시됩니다.
 
Enter key password for ALIAS_NAME:
 
올바른 키 암호가 입력되면 서명이 진행되고 서명이 완료되면 "jar signed."가 표시됩니다.
 
 
jarsigner command in windows cmd
 

command line에서 -storepass와 -keypass 옵션을 이용하면 암호를 미리 지정하여 실행할 수도 있습니다.
해당 옵션을 사용하면 암호를 입력하라는 메시지가 표시되지 않고 자동으로 입력됩니다.
 
[ APK ]
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore -storepass [키스토어_암호] -keypass [키_암호] "KEYSTORE_PATH" "APP_FILE_PATH" "ALIAS_NAME"
[ AAB ]
jarsigner -verbose -sigalg SHA256withRSA -digestalg SHA-256 -keystore -storepass [키스토어_암호] -keypass [키_암호] "KEYSTORE_PATH" "APP_FILE_PATH" "ALIAS_NAME"

간혹 올바른 암호를 입력했지만 error 메시지가 표시되는 경우가 있습니다.
이런 경우는 키스토어나 Alias 정보가 정확하게 입력되었는지 우선 확인해 보아야 합니다.
파일 이름과 경로에 공백이나 특수문자가 있는 경우에도 에러가 발생할 수 있습니다.
 
 
 

APK zipalign

 
jarsigner로 서명이 완료된 APK 파일은 추가로 zipalign을 이용한 정렬 작업이 필요합니다.
zipalign을 하지 않아도 설치와 실행에는 문제가 없지만 배포를 위해 앱 마켓에 등록 시 실패할 수 있습니다.
AAB 파일의 경우 zipalign을 해야 한다는 공식적인 가이드가 없음으로 반드시 진행하실 필요는 없습니다.

zipalign은 아래와 같은 형식의 command line을 실행하면 됩니다.

zipalign -f -v 4 "zipalign이 필요한 apk 파일 Path" "zipalign 후 저장될 apk 파일 Path"
 
zipalign command in windows cmd
 
 
 

Signing & zipalign with script file

 
지금까지 수동으로 signing과 zipalign 하는 방법을 알아보았습니다.
아래 스크립트 파일은 signing과 zipalign을 쉽게 진행할 수 있는 샘플 스크립트 입니다.

[ Windows 사용자 용 bat 파일]

[ MAC 사용자 용 sh 파일]

위 샘플 스크립트의 사용방법은 아래와 같습니다.
다운받은 파일을 메모장이나 텍스트 편집기로 열고, 아래의 내용을 수정한 후 저장합니다.

KeyStorePath="키스토어 경로"
ALIAS_NAME="alias 이름"
STORE_PASS="키스토어 암호"
KEY_PASS="키 암호"
ZIP_ALIGN="zipalign 파일의 경로"

zipalign 파일은 Android SDK가 설치된 경로의 build-tools에 위치하고 있습니다.
만약 암호를 저장하지 않고 직접 입력하기를 원하시는 경우 -storepass와 -keypass 관련 옵션을 제거하면 됩니다.

Windows 사용자는 서명할 앱 파일을 LIAPP_sign_windows.bat 파일에 drag하면 바로 실행됩니다.
MAC 사용자는 터미널 프로그램을 실행한 후 스크립트 파일과 앱 파일을 차례로 drag 하거나 아래와 같이 경로를 입력하고 실행합니다.

예 : /Users/username/Downloads/LIAPP_sign_mac.sh /Users/username/AndroidStudioProjects/MyApplication/app/release/app-release.apk

Script run on MAC terminal
 
 
정상적으로 실행되면 "signing: path/file"과 같은 내용들이 표시되고 완료되면 "jar signed." 가 표시됩니다.
만약 "jar signed."가 표시되지 않고 error가 나오는 경우 관련 내용을 확인 후 창을 닫습니다.
이후 error 관련 내용을 조치한 후 다시 실행합니다.
파일 이름과 경로에 공백이나 특수문자가 있는 경우에도 에러가 발생할 수 있습니다.

APK 파일은 서명 후 zipalign을 실행해야 됩니다.
서명 과정에서 문제가 발생하지 않고 "jar signed." 메시지가 확인되었다면 아무 키나 눌러서 zipalign 단계를 진행합니다.
zipalign이 정상적으로 완료되면 "Verification succesful" 메시지가 표시됩니다.
zipalign이 완료된 파일은 파일명 뒤에 _zipaligned가 추가되어 저장됩니다.

jarsigner를 이용한 signing과 zipalign에 관한 보다 자세한 내용은 아래 URL을 참고하시기 바랍니다.

jarsigner : https://docs.oracle.com/javase/8/docs/technotes/tools/windows/jarsigner.html
app-signing : https://developer.android.com/studio/publish/app-signing
zipalign : https://developer.android.com/studio/command-line/zipalign
 
 
LIAPP, 최상의 서비스만을 제공하겠습니다.

 

#android_application_security #ios_application_security #ios_application_security #source_code_hardening #android_app_bundle #AAB #APK #Android App Bundle #모바일_앱_보안 #앱_보안_서비스 #게임_보안_서비스 #소스코드_보호 #난독화 #소스코드_보안 #앱_위변조_방지 #메모리_덤프_방지 #악성코드_탐지 #해킹툴_탐지 #리패키징_방지 #메모리_보안