사인한 키스토어(keystore) 확인하기

안드로이드 어플리케이션은 .keystore 파일을 이용해 내 앱을 사인(signing)할 수 있다. 앱이나 키스토어(keystore)가 한두개라면 모르겠지만, 각 앱마다 다른 키스토어를 만들었다거나 테스트용, 릴리즈용 등으로 여러개의 앱을 가지고 있다보면 사인이 되긴 된건지, 어떤 키로 사인이 된건지 헷갈린다. (CI 환경을 만들어서 차곡차곡 정리해두면 헷갈리 없겠지만)

사인이 된 앱을 가지고 있고, 이 앱이 어떤 키스토어로 사인이 되었는지 확인하고 싶다면 어떻게 해야할까? 결론부터 이야기하면, 앱과 키스토어의 Certificate fingerprint를 비교하면 된다.

먼저 키스토어에서 fingerprint를 확인해보자.

>keytool -list -keystore my-keystore.keystore
Enter keystore password:

키스토어의 비밀번호를 입력하면 다음과 같이 키스토어에 포함된 alias 들의 정보가 출력된다.

Keystore type: JKS 
Keystore provider: SUN 

Your keystore contains 1 entry 

my-service, 2016. 10. 19, PrivateKeyEntry, 
Certificate fingerprint (SHA1): 3C:B6:68:E2:8A:EC:9F:16:7E:2C:20:AA:B2:71:12:1B:98:F2:1E:D9

출력된 데이터에서 Certificate fingerprint 부분을 확인한다.

이번에는 사인된 앱에서 Certificate fingerprint를 확인해보자. 키스토어를 확인할 때와 마찬가지로 keytool을 이용한다.

>keytool -list -printcert -jarfile my-app.apk

위와 같이 커맨드라인에서 입력하면, 앱 안의 META-INF 폴더 안의 .RSA 파일에서 인증서 정보를 추출하여 인증서의 정보를 보여준다.

...
Certificate fingerprints:
MD5: D8:2A:99:53:1E:7E:9D:B5:3A:44:FC:2D:99:48:38:17
SHA1: 3C:B6:68:E2:8A:EC:9F:16:7E:2C:20:AA:B2:71:12:1B:98:F2:1E:D9
SHA256: 5E:9C:8E:B8:D0:8E:E7:44:7B:5D:B5:1D:83:1F:D3:80:84:0C:F2:DC:15:DC:71:1E:E6:20:70:D6:B4:7B:9C:AB
...

그 중에서 같은 방법으로 만들어진 Certificate fingerprint를 비교해서 같다면, 이 앱은 이 키스토어로 사인된 것으로 보면 된다.

그리고 위에서 언급했듯이 인증서의 위치가 META-INF/*.RSA로 고정되어 있다. 그러므로, .apk 파일을 압축해제 한 후에 META-INF/*.RSA 파일에 아래 명령어를 실행해도 Certificate fingerprint를 꺼낼 수 있다.

keytool -printcert -file CERT.RSA

참조

debug용 keystore 만들기

Android는 keystore를 이용해 개발자 자신의 앱을 signing 한다. 그런데, 이미 1.0을 release했는데 업데이트가 잘 되는지 궁금 할때 처럼, 기존 자신의 app을 지우지 않은 채 설치(정확히는 update)를 하며 테스트를 해야할 때가 있다. 이때, 매번 export 메뉴를 이용해 내 keystore를 지정, signing을 하는 번거로운 작업을 반복 해야할까?

이 때는, debug용 keystore를 추가로 만들면 된다. Eclipse ADT를 이용해 개발할 때에는 기본적으로 범용 debug.keystore가 들어있다. 이 keystore를 대신할 keystore를 만드는 것이다. 방법은 간단하다. release keystore를 이용해 나만의 debug용 keystore를 만든 후 “Preference > Android > Build > Custom debug keystore”에서 만든 debug용 keystore로 바꿔주면 된다. 이렇게 하면 매번 export하지 않고 “Run As > Android Application”을 통해 app을 계속 설치할 때 INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES 에러를 안 볼 수 있다.

명령어는 다음과 같다.

keytool -importkeystore -v -srckeystore [릴리즈용 키스토어 파일이름] -destkeystore [디버그용 키스토어 파일이름] -srcstorepass [릴리즈용 키스토어 비밀번호] -deststorepass android -srcalias [alias 이름] -destalias androiddebugkey -srckeypass [alias 비밀번호] -destkeypass android

예제는 다음과 같다.

keytool -importkeystore -v -srckeystore my.keystore -destkeystore my.debug.keystore -srcstorepass mystorepassword -deststorepass android -srcalias myAlias -destalias androiddebugkey -srckeypass myaliaspassword -destkeypass android

아니, 왜 비번이 “android”인가? 위에서 언급한 IDE 안의 keystore는 자동으로 생성된다. 그리고 이 keystore를 이용해 signing할 때마다 비밀번호를 입력하는 번거로운 작업이 필요하다. 이를 IDE가 대신 해주는데, 비번을 고정해서 사용하고 있는 거다. “android”로, 그래서 그에 맞추어 비번을 바꿔줘야 IDE를 통한 빌드를 사용할 수 있다.

그럼 debug용 키와 release용 키는 어디가 같고 어디가 다른걸까? 간단히 말하면 핑거프린트(fingerprint)가 같다. 그리고 위에서 수정한대로 비밀번호와 알리아스(alias)가 다르다. fingerprint가 뭔지 궁금하다면 다른 글을 참조하자.

참, keytool은 안드로이드 SDK가 아니라 JDK(Java Development Kit) 안에 들어있다.keystore가 안드로이드에서 유용하게 쓰이지만, 원래는 Java에서 지원하는 기능이라 그렇다.