Flutter - 안드로이드 앱 서명(키스토어) JKS 파일 생성, 앱 자동 서명 등록 방법

개요

업로드 키 스토어 파일은 앱을 서명하기 위한 파일로,

안드로이드 앱의 서명 및 암호화 키를 안전하게 저장되는 데 사용되는 파일이다.

구글 플레이 스토어에 앱을 게시하려면 업로드 키 스토어를 필요로 하며,

서명되지 않는 앱의 경우 플레이 콘솔에 앱을 업로드 할 수 없다.

 

이번 포스팅에서는

  1. 키 스토어를 생성하는 방법
  2. 안드로이드 앱에서 키 스토어를 참조하여 앱에 서명하는 방법
  3. 그리고 서명된 앱을 앱 번들(App Bundle, aab)로 만드는 방법

세 가지를 위주로 설명하겠다.


업로드 키 스토어 생성하는 방법

기존의 키 스토어가 있으면 해당 단계는 진행하지 않아도 된다.

키 스토어가 존재하지 않을 경우 아래의 명령어를 실행한다.

해당 실행 명령어는 플러터 공식 문서를 참고하였다.

  • macOS 또는 리눅스의 경우
keytool -genkey -v -keystore ~/upload-keystore.jks -keyalg RSA \
        -keysize 2048 -validity 10000 -alias upload

 

  • 윈도우 터미널(또는 파워쉘)의 경우
keytool -genkey -v -keystore %userprofile%\upload-keystore.jks ^
        -storetype JKS -keyalg RSA -keysize 2048 -validity 10000 ^
        -alias upload

 

[ 키스토어 생성 명령어 설명 ]

  • -keystore %userprofile%\upload-keystore.jks
    • 사용자 폴더에 upload-keystore.jks 이름의 키스토어 파일을 생성한다.
    • 파일 이름은 사용자가 임의로 정할 수 있다.
  • -storetype JKS
    • 키 스토어 타입을 JKS로 지정한다. 자바9에서는 JKS를 필요로 하기 때문에 사용한다.
    • 기본값은 PKS12이다.
    • 만약 자바9를 사용하지 않는다면 해당 태그는 생략해도 괜찮다.

  • -keyalg RSA -keysize 2048 -validity 10000
    • 2048비트 RSA 키로 10000일 동안 유효한 키를 만든다.
  • -alias
    • 키 스토어의 별칭을 지정한다.

 

명령어를 실행하면 다음과 같은 입력 문구가 차례로 뜬다.

입력해 주자. 포스팅을 위해 예시로 입력한 것이므로 각자 입력하면 된다.

  • Enter keystore password : 123456
    • 키 저장소 비밀번호 입력 : 비밀번호의 글자는 최소 6글자여야 한다.
  • Re-enter new password : 123456
    • 새 비밀번호 다시 입력 : 비밀번호 재확인 용도이므로 위에 입력한 비밀번호를 다시 입력해주자.

 

비밀번호 입력 이후부터는 앱에 표시되지 않고 APK의 일부로 인증서에 포함되는 정보이다.

그러므로 상황에 맞게 적절히 기입해 준다.

[ 예시 입력 ]

  • What is your first and last name?
    • 이름과 성을 입력하십시오. : 담당자 혹은 관리자(개발자) 이름을 넣어주자.
  • What is the name of  your organizational unit?
    • 조직 단위 이름을 입력하십시오. : 회사의 부서나 팀 이름을 입력한다. 
  • What is the name of your organization?
    • 조직 이름을 입력하십시오. : 회사 이름을 입력한다.
  • What is the name of your City or Locality?
    • 구/군/시 이름을 입력하십시오? : 지역을 입력한다.
  • What is the name of your State or Province?
    • 시/도 이름을 입력하십시오. : 지역을 입력한다.

  • What is the tow-letter country code for this unit?
    • 이 조직의 두 자리 국가 코드를 입력하십시오. : 국가 코드를 입력한다. 한국은 82를 사용한다.
  • Is ~~~~~ correct?
    • 입력한 정보가 맞는지 되물어보는 절차이므로 y를 입력하고 엔터를 누른다.
  • 이후 처음에 설정한 비밀번호를 두 번 입력하면 키 스토어 파일이 사용자 폴더 하위에 생성된다.

<스토어 타입을 JKS로 설정한 키스토어 파일 생성 화면>

 

<스토어타입을 PKCS12로 설정한 스토어 파일 생성 화면>

 

윈도우OS를 기준으로 키스토어 생성 경로를 모르겠다면

디렉토리 주소 창에 아래의 명령어를 입력하고 upload-keystore.jks 파일이 생성되었는지 확인해보자.

%userprofile%

<키 스토어 파일이 정상적으로 생성된 화면>


생성한 키스토어를 앱에서 사용하기

키스토어 속성 파일 생성하기

플러터 프로젝트에서 android 하위 폴더에 ' key.properties ' 의 이름을 가진 파일을 하나 생성한다.

<프로젝트 최상위 디렉토리에 key.properties 파일을 생성한 화면>

 

생성된 key.properties에 다음의 정보를 입력해주자.

  • storePassword / keyPassword
    • 위에서 생성한 키 스토어의 비밀번호를 입력해준다.
    • 두 비밀번호는 동일해야한다.
  • keyAlias
    • 키 스토어에서 지정한 별칭을 입력한다.

  • storeFile
    • 키 스토어의 저장 위치를 지정한다.
    • 위의 절차를 차례대로 진행하여 키 스토어를 생성한 경우
      • MacOS : /Users/<user name>/upload-keystore.jks 
      • Windows : C:\\Users\\<user name>\\upload-keystore.jks
    • 프로젝트 폴더 내에 키 스토어 파일을 이동한 경우
      • app>android : ./upload-keystore.jks
      • 플러터 루트 프로젝트일 경우 : ../../upload-keystore.jks
storePassword=123456
keyPassword=123456
keyAlias=upload
storeFile=../../upload-keystore.jks

그레이들에 앱 서명 등록하기 (자동 서명 등록하기)

플러터 프로젝트에서 android > app > build.gradle 파일을 연다.

build.gradle 파일에서 아래의 코드를 추가해준다.

   def keystoreProperties = new Properties()
   def keystorePropertiesFile = rootProject.file('key.properties')
   if (keystorePropertiesFile.exists()) {
       keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
   }

   android {
         ...
   }

<android-app-build.gradle 파일에 키 스토어 정보를 추가한 화면>

 

동일하게 build.gradle 파일에서 스크롤을 쭉 내리다보면 buildTypes 부분을 확인할 수 있다.

빌드타입의 서명 구성 정보를 다음과 같이 변경해준다.

/* 기존 빌드 타입 설정
    buildTypes {
        release {
            // TODO: Add your own signing config for the release build.
            // Signing with the debug keys for now, so `flutter run --release` works.
            signingConfig signingConfigs.debug
        }
    }
*/

// 변경된 빌드 타입 설정
  signingConfigs {
       release {
           keyAlias keystoreProperties['keyAlias']
           keyPassword keystoreProperties['keyPassword']
           storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
           storePassword keystoreProperties['storePassword']
       }
   }
   buildTypes {
       release {
           signingConfig signingConfigs.release
       }
   }

 

이제 앱에 릴리즈 모드에서 빌드가 자동으로 서명된다.

서명된 앱을 aab로 만들면 된다.

flutter build appbundle

Error

그레이들 파일을 변경한 후에 앱 서명이 적용되지 않을 경우

만약 그레이들 파일을 변경한 후에 앱 서명이 적용되지 않는다면,

flutter clean 명령어를 실행 후 다시 확인해보자.

flutter clean

aab 파일을 만드는 과정에서 오류가 발생할 경우

aab 파일을 만드는 과정에서 다음과 같은 오류가 발생한다면,

android>key.properties 파일에서 storeFile의 경로를 확인해보자.

키 저장소 경로가 잘못되어서 발생되는 오류이다.

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:validateSigningRelease'.
> Keystore file '~\android\app\upload-keystore.jks' not found for signing config 'release'.

* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.

* Get more help at https://help.gradle.org

<키 스토어 파일의 경로가 잘못되어 빌드 중 오류가 출력된 화면>


참고