Keytool(키 해시)

Published: by

명령어

 -certreq            인증서 요청을 생성합니다.
 -changealias        항목의 별칭을 변경합니다.
 -delete             항목을 삭제합니다.
 -exportcert         인증서를 익스포트합니다.
 -genkeypair         키 쌍을 생성합니다.
 -genseckey          보안 키를 생성합니다.
 -gencert            인증서 요청에서 인증서를 생성합니다.
 -importcert         인증서 또는 인증서 체인을 임포트합니다.
 -importpass         비밀번호를 임포트합니다.
 -importkeystore     다른 키 저장소에서 하나 또는 모든 항목을 임포트합니다.
 -keypasswd          항목의 키 비밀번호를 변경합니다.
 -list               키 저장소의 항목을 나열합니다.
 -printcert          인증서의 콘텐츠를 인쇄합니다.
 -printcertreq       인증서 요청의 콘텐츠를 인쇄합니다.
 -printcrl           CRL 파일의 콘텐츠를 인쇄합니다.
 -storepasswd        키 저장소의 저장소 비밀번호를 변경합니다.

키 해시 얻기

keytool -exportcert -alias excitingbooking -keystore xxx.jks | openssl sha1 -binary | openssl base64

(Enter)

키 저장소 비밀번호 입력: xxxxxxxx

(Enter)

JKS 키 저장소는 고유 형식을 사용합니다. "keytool -importkeystore -srckeystore xxx.jks -destkeystore xxx.jks -deststoretype pkcs12"를 사용하는 산업 표준 형식인 PKCS12로 이전하는 것이 좋습니다.

dAYcVxxxxxxxxxxxx0hWB0= 

참고

https://developers.kakao.com/docs/android/getting-started#키해시-등록

디버그 키해시

Android Studio로 앱을 디버그 빌드하게 되면 기본적으로 Android SDK 설치시 생성되는 개발용 디버그 키스토어를 사용하여 앱을 사인하게 됩니다. 등록해야할 디버그 키해시는 개발 머신의 터미널에서 아래와 같이 수행한 값입니다.

Commandline으로 키해시 구하기
keytool -exportcert -alias androiddebugkey -keystore <debug_keystore_path> -storepass android -keypass android | openssl sha1 -binary | openssl base64
    • OS X와 리눅스 : ~/.android/debug.keystore
    • Windows Vista와 Windows 7 예: C:\Users<user>.android\debug.keystore
    • Windows XP 예 : C:\Documents and Settings<user>.android\debug.keystore
  • keytool : $JAVA_HOME/bin 아래에 존재합니다.
  • openssl : Windows의 경우는 다운받아 설치합니다.
앱 내 자바 코드로 키해시 구하기
public static String getKeyHash(final Context context) {
    PackageInfo packageInfo = getPackageInfo(context, PackageManager.GET_SIGNATURES);
    if (packageInfo == null)
        return null;

    for (Signature signature : packageInfo.signatures) {
        try {
            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            return Base64.encodeToString(md.digest(), Base64.NO_WRAP);
        } catch (NoSuchAlgorithmException e) {
            Log.w(TAG, "Unable to get MessageDigest. signature=" + signature, e);
        }
    }
    return null;
}

만약 여러 명의 개발자가 앱의 개발에 참여하고 있다면 각 개발자들의 개발 환경의 디버그 키스토어가 다를 것이므로 여러개의 키해시를 모두 등록하셔야 개발에 지장이 없습니다.

릴리즈 키해시

앱 배포를 위하여 릴리즈 빌드로 APK를 생성할 경우에는 디버그 키스토어가 아닌 .jks 확장자를 가진 릴리즈용 키스토어로 사인을 하게 됩니다. 이 릴리즈용 키스토어도 동일한 절차를 거쳐 키해시를 구할 수 있습니다.

keytool -exportcert -alias <release_key_alias> -keystore <release_keystore_path> | openssl sha1 -binary | openssl base64

이 릴리즈 키해시도 등록을 해주셔야 릴리즈 빌드로 생성한 APK와 마켓에서 유저들이 설치한 APK에서 카카오 API가 정상동작합니다. 만약 위의 절차들을 정상적으로 거치지 않았다면 아래와 같은 에러를 받게 됩니다.

{"msg":"appkey does not match to registered app info (ios bundle id, android key hash, web domain url).","code":-401}

만약 구글 플레이 개발자 콘솔에서 Google play app signing 기능을 활성화시키셨다면 구글 플레이에 앱이 릴리즈되기 전에 개발자의 로컬 개발 환경에서 릴리즈 키스토어의 시그너쳐가 삭제되고 구글 서버에 저장되어 있는 사이닝키의 시그너쳐로 교체됩니다. 그렇기 때문에 이 사이닝키로 생성한 키해시 또한 등록해줘야 합니다.

https://developers.kakao.com/docs/android/getting-started#키해시-등록