Invalid keystore format 오류와 keyhash, JAVA_HOME path 설정
포스트
취소

Invalid keystore format 오류와 keyhash, JAVA_HOME path 설정

Android를 빌드할 땐 서명할 때 사용하는 keystore가 있습니다.

이전 글인 카카오톡 로그인을 구현할 때 keyhash를 추출하는 방법도 일부 소개했었는데

playstore에 제출할 때 또 keyhash를 다룰 일이 있었고, 이번에 발생했던 문제와 해결방법을 정리해 보았습니다.

기본 keyhash 추출

debug keystore같은 경우는 보통 이 명령어를 통해서 추출합니다.

1
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore -storepass android -keypass android | openssl sha1 -binary | openssl base64

여기서, | 기호는 쉘에서 pipe입니다.

A | B | C가 호출된다면 A의 stdout을 B가 stdin으로 읽어오고 C 도 마찬가지로 동작하게 됩니다.

1
2
3
4
5
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore -storepass android -keypass android
# keytool 명령어의 결과가 openssl 명령어의 stdin으로 이어집니다.
openssl sha1 -binary
# ketool>openssl을 거친 명령어의 결과가 openssl base64로 이어집니다
openssl base64

두번째 줄의 sha1은 해시 함수를 실행해 주는 명령어로, 임의의 길이의 데이터를 입력받아 160비트의 고정된 길이 해시 값을 출력 해 줍니다.

고로, keytool에서 문제가 생기던 말던, 어떤 버그를 출력하던 말던 일단 output의 형태가 hash형태라는 의미입니다.

그래서, pipe를 사용하면 결과로 나온 hash값이 실제로 내가 원했던 hash값인지 아닌지 알 수 없었습니다.

keytool 오류: java.io.IOException: Invalid keystore format

debugging모드에서 카카오톡 로그인이 잘 되었지만 release모드로는 카카오톡 로그인이 안되어서 pipe를 떼고 각각 실행시켜 얻었던 오류입니다.

이 문제는 jdk 11로 생성한 key를 jdk 8 이하 버전을 사용해서 서명할 경우 해당 오류가 발생합니다.

제 경우는 android studio 설정이 다음과 같이 되어있었습니다.

image-20240117114138937

그리고 terminal에서 keytool 명령어를 사용하면 동작하는 jdk 버전(path에 등록된 jdk)은 아래 사진에 강조한 버전이었습니다.

screenshot.png

terminal에 java --version을 입력해도 확인할 수 있습니다.

아무튼, 버전의 차이가 있어서 keytool 오류: java.io.IOException: Invalid keystore format 오류를 겪었습니다.

그래서 jdk8을 사용하던 이전 설정 대신 jbr-17을 사용하게 변경 해 주었습니다.

java path 설정

우선, ~에 .zsh_profile에 작성중인 쉘 프로파일이 있어 해당 파일에 이어 붙여넣기 했습니다.

sudo nano ~/.zsh_profile을 입력하고

1
2
3
JAVA_HOME=/Applications/Android\ Studio.app/Contents/jbr/Contents/Home
export JAVA_HOME
export PATH="$PATH:$JAVA_HOME/bin"

해당 스크립트를 더 붙여 넣어주었습니다.

이후 source .zsh_profile 을 입력해주면 됩니다.

image-20240117121207851

바뀐 버전을 확인하면 설정 완료입니다.

결론

이제껏 개발해온 경험들을 생각해 보면, 사람마다 사용하는 os도 다르고 기존에 설치해 온 프로그램들도 달라

똑같은 걸 따라 하는데도 나는 안되어서 애먹는 경우가 꽤나 많았던 것 같습니다. 명령어 하나하나가 어떤 의미인지 알아가며

문제의 근원을 찾아나가는 것은 어려운 일이지만 실력 향상에는 크게 도움이 된다고 생각하고 있습니다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

Flutter Clip이 뭐지? Clipbehavior 등.

Flutter에서 앱 패키지 이름 변경법