본문으로 바로가기

1. APK 파일 인증서 등록이란?

- "코드사인(Code Sign)" 또는 "앱 서명"이라고도 부르며, APK파일에 인증서를 등록하는 과정을 말한다.

- 인증서를 등록하지 않으면 리패키징한 APK 파일이 정상적으로 설치 또는 실행이 되지 않는다.

※ APK 파일 리패키징 과정에 대한 설명은 아래의 링크 참고.

안드로이드 APK 파일 디컴파일/리패키징 방법

 

안드로이드 APK 파일 디컴파일/리패키징 방법

1. 디컴파일/리패키징 이란? 1.1. 컴파일(compile) - 소스코드(source code)에서 기계가 인식할 수 있는 바이너리(binary) 파일로 변환하는 과정을 말한다. - 안드로이드는 컴파일 이후 패키징(packaging)과 코

hagsig.tistory.com

 

2. APK 파일 인증서 등록

- APK 파일 인증서 등록은 signapk.jar을 이용한 방법과 jarsigner.exe를 이용한 방법이 있다.

※ signapk.jar는 2015년 이후 더 이상 업데이트가 되고 있지 않아 최신 앱들은 잘 먹히지 않는다.

 

2.1. signapk.jar 을 이용한 인증서 등록 방법

- 아래의 링크에 접속하여 인증서 등록에 필요한 파일을 다운로드한다.

https://github.com/techexpertize/SignApk

 

GitHub - techexpertize/SignApk: SignApk is used to sign the apk file after repack. The easiest way ever.

SignApk is used to sign the apk file after repack. The easiest way ever. - GitHub - techexpertize/SignApk: SignApk is used to sign the apk file after repack. The easiest way ever.

github.com

 

- 아래의 명령어를 입력하여 컴파일한 apk 파일에 인증서를 씌워준다.

java -jar signapk.jar certificate.pem key.pk8 "인증할APK파일경로" "저장할APK파일경로"

 

2.2. jarsigner.exe을 이용한 재서명 방법

- JAVA(JDK)를 설치하였다면 기본적으로 설치되어 있다.

※ 자바가 설치되어있지 않다면 아래의 링크를 클릭해 설치한다.

https://www.oracle.com/kr/java/technologies/downloads/#jdk20-windows

 

Download the Latest Java LTS Free

Subscribe to Java SE and get the most comprehensive Java support available, with 24/7 global access to the experts.

www.oracle.com

 

- 관리자 권한으로 명령프롬프트(cmd) 실행 → [자바설치경로]\bin 경로로 이동.

#예시
cd "C:\Program Files\Java\jdk-20\bin"

 

- [자바설치경로]\bin 폴더 내에 존재하는 keytool을 이용하여 keystore를 생성한다.

keytool -genkey -v -keystore <임의파일명.keystore> -alias <임의별칭> -keyalg RSA -keysize 2048

*genkey : 키(비밀키, 공개키) 생성
*verbose : 진행 표시
*keyalg : 키를 생성하는 알고리즘 지정(DSA/RSA)

실행 예시
C:\Windows\system32>cd C:\Program Files\Java\jdk-20\bin

C:\Program Files\Java\jdk-20\bin>keytool.exe -genkey -v -keystore newkey.keystore -alias hyunwoo -keyalg RSA -keysize 2048
Enter keystore password: 패스워드입력
Re-enter new password: 패스워드입력
Enter the distinguished name. Provide a single dot (.) to leave a sub-component empty or press ENTER to use the default value in braces.
What is your first and last name?
  [Unknown]:  hagsig
What is the name of your organizational unit?
  [Unknown]:  android
What is the name of your organization?
  [Unknown]:  hagsig
What is the name of your City or Locality?
  [Unknown]:  seoul
What is the name of your State or Province?
  [Unknown]:
What is the two-letter country code for this unit?
  [Unknown]:  KO
Is CN=hyunwoo, OU=android, O=hyunwoo, L=seoul, ST=Unknown, C=KO correct?
  [no]:  y

Generating 2,048 bit RSA key pair and self-signed certificate (SHA384withRSA) with a validity of 90 days
        for: CN=hyunwoo, OU=android, O=hyunwoo, L=seoul, ST=Unknown, C=KO
[Storing newkey.keystore]

 

- keystore를 생성한 후 jarsigner을 이용하여 APK 파일에 인증서를 등록한다.

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore <생성한keystore파일경로> <리패키징할APK경로> -signedjar <인증서등록한APK저장경로> <지정한별칭>
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore <생성한keystore파일경로> -storepass <keystore패스워드> <리패키징할APK경로> -signedjar <인증서등록한APK저장경로> <지정한별칭>
실행 예시
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore newkey.keystore target.apk -signedjar sign.apk hagsig
Enter Passphrase for keystore: 패스워드입력

>>> Signer
    X.509, CN=hyunwoo, OU=android, O=hyunwoo, L=seoul, ST=Unknown, C=KO
    Signature algorithm: SHA384withRSA, 2048-bit key
    [trusted certificate]

jar signed.

 

4. 인증서를 등록한 APK 파일 설치

- 위 과정을 거친 인증서를 등록한 APK 파일을 설치 및 실행하면 정상적으로 동작하는 것을 확인할 수 있다.

- 만약 "패키지가 잘못되어 앱이 설치되지 않았습니다.", "어플설치 실패", "Failure [INSTALL_FAILED_INVALID_APK: Failed to extract native libraries, res=-2]" 등의 오류 메시지가 출력되며 설치가 되지 않는다면, 아래와 같이 AndroidManifest.xml 내용을 수정한다.

- AndroidManifest.xml 파일의 설정정보 중 android:extractNativeLibs="false"를 "true"로 변경한 다음, 다시 리패키징 및 인증서 등록 과정을 수행한 뒤 설치해 본다.