원문 : http://developer.android.com/tools/publishing/app-signing.html


주의 : 번역이 개판이므로 원문을 참조하세요.

주의 : 허락받고 번역한 것이 아니므로 언제든 내려갈 수 있습니다.

주의 : 가독성을 높이기 위해서 잘 알려진 용어나 발음이 비슷한 용어는 한글로 표기합니다.


Signing Your Applications( 응용프로그램 서명하기 )


안드로이드 시스템은 모든 설치된 응용프로그램들이 응용프로그램의 개발자에 의해 설정된held 개인 키private key 를 가진 인증서certificate 를 사용해 디지털 방식으로 서명될 것을 요구한다. 안드로이드 시스템은 그 인증서를 응용프로그램의 저작자를 식별하고 응용프로그램 사이에서 신뢰 관계를 설정하는데 사용한다. 그 인증서는 사용자가 설치할 수 있는 응용프로그램이 무엇인지를 제어하는데 사용되지는 않는다. 그 인증서는 인증 기관certificate authority에 의해서 서명될 필요는 없다: 안드로이드 응용프로그램을 위해서 자체 서명 인증서를 사용하는 것은 일반적이며 완전히 허용되어 있다.


안드로이드 응용프로그램에 대한 서명을 이해하기 위해서 몇 가지 중요한 점이 있다 :


  • 모든 응용프로그램은 반드시 서명되어야만 한다. 시스템은 서명되지 않은 응용프로그램을 에뮬레이터나 디바이스 상에 설치하지 않을 것이다.
  • 응용프로그램을 디버깅하기 위해서, 빌드 툴들은 당신의 응용프로그램을 특별한 디버그 키를 사용해서 서명하는데, 그것은 안드로이드 SDK 빌드 툴에 의해서 생성된다.
  • 당신의 응용프로그램을 최종 사용자들에게 릴리스할 준비가 되었을 때, 당신은 그것을 적절한 개인 키를 사용해 서명해야만 한다. 당신은 SDK 툴들에 의해서 생성된 디버그 키를 사용해 서명된 응용프로그램을 배포할 수 없다.
  • 당신의 응용프로그램을 서명하기 위해서 자체 서명된 인증서를 사용할 수 있다. 인증 기관은 필요치 않다.
  • 시스템은 서명자의 인증서의 유효 기간을 설치시에만 검사한다. 만약 응용프로그램의 서명자 인증서가 응용프로그램이 설치된 후에 만료되었다면, 응용프로그램은 정상적으로 계속 기능할 것이다.
  • 당신은 표준 툴 - Keytool 과 Jarsigner - 를 사용해서 키를 생성하고 응용프로그램 .apk 파일들을 서명할 수 있다.
  • 릴리스를 위해서 당신의 응용프로그램을 서명한 후에, 당신이 zipalign 툴을 사용해 최종 APK 패키지를 최적화할 것을 추천한다.


안드로이드 시스템은 적절히 서명되지 않은 응용프로그램을 설치하거나 실행하지 않을 것이다. 이는 안드로이드 시스템이 실제 디바이스에서 실행되든 에뮬레이터에서 실행되든 상관없이 적용된다. 그렇기 때문에, 당신은 반드시 에뮬레이터나 디바이스 상에서 그것을 실행하거나 디버깅하기 전에 응용프로그램에 대한 서명을 설정해야만 한다.


Signing Process( 서명 절차 )



안드로이드 빌드 절차는 응용프로그램을 빌드하기 위해서 사용하는 빌드 모드에 의존해 다른 서명을 한다. 두 가지 빌드 모드가 있다: 디버그 모드와 릴리스 모드. 당신은 응용프로그램을 개발하고 테스트하고 있는 동안에 디버그 모드를 사용한다. 당신은 사용자에게 직접적으로 배포할 수 있거나 Google Play 와 같은 응용프로그램 마켓에서 배포할 수 있는 릴리스 버전의 응용프로그램을 빌드하고자 할 때 릴리스 모드를 사용한다. 


디버그 모드에서 빌드할 때, 안드로이드 SDK 빌드 툴들은 ( JDK 에 포함된 ) Keytool 유틸리티를 사용하여 디버그 키를 생성한다. SDK 빌드 툴들은 디버그 키를 생성하기 때문에, 그것들은 디버그 키의 별명alias과 비밀번호를 알고 있다. 당신이 디버그 모드로 응용프로그램을 컴파일할 때마다, 빌드 툴들은 ( 역시 JDK 에 포함된 ) Jarsigner 유틸리티와 디버그 키를 사용해서 당신의 응용프로그램의 .apk 파일을 서명한다. 그 별명과 비밀번호가 SDK 빌드 툴들에 알려져 있기 때문에, 그 툴들은 당신에게 디버그 키의 별명과 패스워드를 컴파일할 때마다 묻는 작업을 할 필요가 없다.


당신이 릴리스 모드로 빌드할 때, 당신은 자신만의 개인 키를 사용해 당신의 응용프로그램을 서명한다. 만약 당신이 개인 키를 가지고 있지 않다면, 당신은 Keytool 유틸리티를 사용해서 키를 생성할 수 있다. 응용프로그램이 릴리스 모드에서 컴파일될 때, 빌드 툴들은 당신의 개인 키를 Jarsigner 유틸리티와 함께 사용해 당신의 응용프로그램의 .apk 파일을 서명한다. 당신이 사용하는 인증서와 개인키는 당신의 것이기 때문에, 당신은 keystore 와 key alias 를 위한 비밀번호를 제공해야만 한다.


당신이 Eclipse 를 ADT 플러그인과 함께 사용해 응용프로그램을 실행하거나 디버깅하고 있을 때는, 디버그 서명 절차가 자동적으로 수행된다. Ant 빌드 스크립트를 debug 옵션과 함께 사용할 때도, 디버그 서명은 자동적으로 수행된다. 당신은 Eclipse Export Wizard 를 사용하거나 Ant 빌드 스크립트를 수정하고 release 옵션으로 빌드함으로써 릴리스 서명 절차를 자동화할 수 있다.


Signing Strategies( 서명 전략들 )



어떤 관점에서의 응용프로그램 서명은 아마도 당신의 응용프로그램 개발에 접근하는 방식에 영향을 줄 수도 있다. 특히 당신이 여러 개의 응용프로그램을 릴리스할 계획을 가지고 있다면 더욱 그러하다.


일반적으로 모든 개발자들을 위해서 추천되는 전략은 당신의 응용프로그램의 기대 수명 전반에 있어서 같은 인증서를 사용해서 서명하는 것이다. 당신이 그렇게 해야 하는 몇 가지 이유가 있다 :


  • 응용프로그램 업그레이드 - 당신이 응용프로그램에 업데이트를 릴리스할 때, 만약 사용자가 새로운 업데이트를 끊김없이 사용하기를 원한다면, 당신은 계속해서 같은 인증서나 같은 인증서 집합을 사용해 업데이트에 서명하는 것을 원할 것이다. 시스템이 응용프로그램에 대한 업데이트를 설치할 때, 그것은 현존하는 버전의 인증서와 새로운 버전의 인증서를 비교한다. 만약 인증서 데이터와 순서가 정확하게 맞으면, 시스템은 업데이트를 허용한다. 만약 당신이   일치하는 인증서들을 사용하지 않고 새로운 버전을 서명하게 되면, 당신은 응용프로그램에 대해 새로운 패키지 이름을 할당할 필요가 있을 것이다 - 이 경우에, 사용자는 완전히 새로운 응용프로그램으로서 새로운 버전을 설치한다.
  • 응용프로그램 모듈화 - 안드로이드 시스템은 같은 인증서에 의해 서명된 응용프로그램들이 같은 프로세스에서 실행될 것을 요청받으면 그것을 허용한다. 그래서 시스템은 그것들을 단일 응용프로그램으로 취급한다. 이러한 방식으로 당신은 응용프로그램을 모듈 단위로 배치할 수 있으며, 사용자들은 필요하다면 각 모듈을 독립적으로 업데이트할 수 있다.
  • 권한을 통한 코드/데이터 공유 - 안드로이드 시스템은 서명 기반 승인 집행signature-based permissions enforcement을 제공한다. 그래서 응용프로그램은 특정 인증서를 사용해 서명된 다른 응용프로그램에 기능을 노출할 수 있다. 여러 개의 응용프로그램을 같은 인증서를 사용해 서명하고 서명 기반 승인 검사를 이용하면, 당신의 응용프로그램은 안전하게 코드와 데이터를 공유할 수 있다.


서명 전략을 결정하는 데 있어서 다른 중요하게 고려해야할 점은 당신의 응용프로그램을 서명하기 위해서 사용할 키의 유효 기한을 설정하는 방법이다.


만약 당신이 단일 응용프로그램을 위한 업그레이드를 지원할 계획을 가지고 있다면, 당신은 당신의 키가 그 응용프로그램의 기대 수명을 초과하는 유효 기한을 가지도록 보장해야만 한다. 25 년 이상의 유효 기한이 추천된다. 당신의 키의 유효 기한이 만료되면, 사용자들은 더 이상 계속해서 새로운 버전의 응용프로그램에 대한 업그레이드를 할 수 없을 것이다.

만약 당신이 여러 개의 분리된 응용프로그램들을 같은 키를 사용해서 서명한다면, 당신은 당신의 키가 모든 응용프로그램의 모든 버전에 대한 기대 수명을 초과하는 유효기한을 가지도록 보장해야만 한다. 이 때 그 응용프로그램들에는 미래에 추가할 수도 있는 의존성있는 응용프로그램들이 포함된다.

만약 당신이 응용프로그램을 Google Play 에서 배포할 계획을 가지고 있다면, 당신이 응용프로그램을 서명하는데 사용한 키는 반드시 2033 년 10 월 22 일 이후에 종료되는 유효 기한을 가져야만 한다. Google Play 는, 새로운 버전이 이용 가능할 때 사용자들이 계속해서 응용프로그램을 업그레이드할 수 있도록 보장하기 위해서, 이 요구사항을 강제한다.


당신의 응용프로그램을 설계할 때, 이러한 점을 유념하고 응용프로그램을 서명하기 위한 적절한 인증서를 확인하기 바란다.


Basic Setup for Signing( 서명을 위한 기본 설정 )



시작하기 전에, Keytool 유틸리티와 Jarsigner 유틸리티가 SDK 빌드 툴들에 대해 이용 가능한지를 확인하라. 두 툴은 모두 JDK 에서 이용할 수 있다. 대부분의 경우에, 당신은 JAVA_HOME 환경 변수를 설정함으로써 이러한 유틸리티들을 찾는 방법을 SDK 빌드 툴들에 알려줄 수 있다. 이를 통해 빌드 툴들은 적절한 JDK 를 참조하게 된다. 그렇지 않으면, 당신은 JDK 버전의 Keytool 과 Jarsigner 을 당신의 PATH 변수에다가 추가할 수 있다.


만약 Java 를 위한 GNU 컴파일러를 원래부터 포함하는 버전의 리눅스 상에서 개발중이라면, 시스템이 JDK 버전의 Keytool 을 사용하고 있는지 확인하라. 만약 Keytool 이 이미 PATH 에 존재한다면, 그것은 /usr/bin/keytool 의 symlink[각주:1] 를 가리키고 있을 것이다. 이 경우, symlink 대상을 확인해 그것이 JDK 의 Keytool 을 가리키는지를 확인하라.


Signing in Debug Mode( 디버그 모드에서 서명하기 )



안드로이드 빌드 툴들은 응용프로그램을 더 쉽게 개발하고 디버깅하게 하기 위해서 디버그 서명 모드를 제공한다. 그러면서도 여전히 APK 를 서명하기 위한 안드로이드 시스템 요구사항을 만족시킨다. 응용프로그램을 빌드하기 위해서 디버그 모드를 사용할 때, SDK 툴들은 Keytool 을 실행해서 자동적으로 디버그 키스토어와 키를 생성한다. 그리고 나서 이 디버그 키는 자동적으로 APK 를 서명하기 위해 사용되며, 그래서 당신은 자신의 키를 사용해 패키지를 서명할 필요가 없다.


SDK 툴들은 디버그 키스토어/키 를 미리 결정된 이름/비밀번호 를 사용해 생성한다.


  • 키스토어 이름 : "debug.keystore"
  • 키스토어 비밀번호 : "android"
  • 키 별명 : "androiddebugkey"
  • 키 비밀번호 : "android"
  • CN: "CN=Android Debug,0=Android,C=US"


필요하다면 디버그 키스토어/키 의 위치/이름 을 변경하거나 커스텀 디버그 키스토어/키 를 공급할 수 있다. 그러나 모든 커스텀 디버그 키스토어/키 는 반드시 ( 위에 언급된 것처럼 ) 기본 디버그 키와 같은 키스토어/키 이름과 비밀번호를 가져야 한다. ( 그렇게 하기 위해서는 Eclipse/ADT 에서, Windows > Preferences > Android > Build 로 이동하라. )


주의 : 당신은 디버그 인증으로 서명된 응용프로그램을 대중에게 릴리스할 수 없다.


Eclipse Users


당신이 Eclipse/ADT 에서 개발하고 있다면 ( 그리고 Basic Setup for Signing 에서 기술된 것처럼 Keytool 과 Jarsigner 를 설정했다면 ), 디버그 모드에서의 서명은 기본적으로 활성화된다. 당신이 응용프로그램을 실행하거나 디버그할 때, ADT 는 .apk 파일을 디버그 인증서를 사용해 서명하고, 패키지 상에 zipalign 을 실행하고, 그 다음에 선택된 에뮬레이터나 연결된 디바이스 상에 그것을 설치한다. 당신이 해야할 특별한 일은 없으며, 제공된 ADT 가 Keytool 에 대한 접근권을 가진다.


Ant Users


만약 .apk 파일을 빌드하기 위해 Ant 를 사용하고 있다면, ant 명령을 debug 옵션과 함께 사용함으로써 디버그 서명 모드가 활성화된다( 당신이 android 툴을 사용해서 생성한 build.xml 파일을 사용하고 있다고 가정한다 ). 당신이 and debug 를 실행해서 응용프로그램을 컴파일할 때, 빌드 스크립트는 키스토어/키 를 생성하며, 당신을 위해서 APK 에 서명한다. 그리고 나서 스크립트는 API 를 zipalign 툴을 사용해 정렬한다. 당신이 해야 할 일은 없다. 더 많은 정보를 원한다면 Building and Running Apps on the Command Line 을 읽어 보라.


Expiry of the Debug Certificate( 디버그 인증서 만료 )


디버그 모드에서 ( Eclipse/ADT 와 Ant 빌드의 기본 설정 ) 응용프로그램을 서명하기 위해서 사용된 자체 서명 인증서는 그것의 생성일로부터 1 년의 만료일을 가진다.


인증서가 만료되면, 당신은 빌드 에러를 만나게 될 것이다. Ant 빌드에서 에러는 다음과 같다 :



Eclipse/ADT 에서, 당신은 안드로이드 콘솔에서 비슷한 에러를 볼 수 있다.


이 문제를 해결하기 위해서는 단순하게 debug.keystore 파일을 제거하기만 하면 된다. AVD 들을 위한 기본 저장소 위치는 OS X 와 Linux 에서는 ~/.android/ 이고, Windows XP 에서는 C:\Documents and Settings\<user>\.android\ 이고, Windows Vista 와 Windows 7 에서는 C:\Users\<user>\.android\ 이다.


다음에 빌드를 하면, 빌드 툴들은 새로운 키스토어와 디버그 키를 생성할 것이다.


당신의 개발 머신이 non-Gregorian locale 을 사용하고 있다면, 빌드 툴들은 아마도 이미 만료된 디버그 인증서를 생성할지도 모른다. 그래서 당신은 응용프로그램을 컴파일하려고 시도할 때마다 에러를 만나게 될 것이다. 이를 우회하기 위한 정보는 문제 해결 토픽인 I can't compile my app because the build tools generated an expired debug certificate 를 참조하라.


Signing in Release Mode( 릴리스 모드에서 서명하기 )



당신의 응용프로그램을 다른 사용자에게 릴리스하기 위한 준비가 되었다면, 당신은 반드시 다음과 같은 일을 수행해야만 한다 :


  1. 적절한 개인 키 획득하라.
  2. 응용프로그램을 릴리스 모드로 컴파일하라.
  3. 당신의 개인 키를 사용해 응용프로그램에 서명하라.
  4. 최종 APK 패키지를 정렬하라.


만약 ADT 플러그인을 사용해 Eclipse 에서 개발중이라면, 컴파일, 서명, 정렬 프로시저를 수행하기 위해서 Export Wizard 를 사용할 수 있다. Export Wizard 는 심지어 당신이 새로운 키스토어와 개인 키를 그 과정에서 생성할 수 있도록 허용한다. 그래서 당신이 Eclipse 를 사용한다면, Compile and sign with Eclipse ADT 는 건너 뛰어도 된다.


1. Obtain a suitable private key( 적절한 개인 키 획득하기 )


응용프로그램에 서명을 하기 위한 준비에서, 당신은 먼저 서명할 적절한 개인키를 가지고 있다는 것을 확신해야만 한다. 적절한 개인 키는 다음과 같은 것이다 :


  • Is in your procession.
  • 응용프로그램과 동일시되기 위한 개인, 회사, 조직을 표현한다.
  • 응용프로그램이나 응용프로그램 모음suite의 기대 수명을 초과하는 유효 기한을 가진다. 25 년 이상의 유효 기한을 추천한다.
    만약 당신이 응용프로그램을 Google Play 에서 배포할 계획이라면, 2033 년 10 월 22 일 이후에 끝나는 유효기간이 요구된다. 당신은 유효 기한이 그 날짜 이전에 만료되는 키를 가지고 서명된 응용프로그램을 올릴 수 없다.
  • 안드로이드 SDK 툴들에 의해 생성된 디버그 키가 아니다.


그 키는 아마 자체 서명될 것이다. 만약 당신이 적절한 키를 가지고 있지 않다면, 반드시 Keytool 을 사용해서 생성해야만 한다. Basic Setup 에서 기술된 것처럼, 당신이 가진 Keytool 이 이용 가능한지 확인하라.


자체 서명된 키를 Keytool 을 사용해 생성하기 위해서는, keytool 명령을 사용하는데, 아래에 열거된 옵션들을 넘긴다( 필요하면 다른 것을 넘길 수 있다 ).


경고 : 개인키를 안전하게 보관하라. Keytool 을 실행하기 전에, 당신의 키를 안전하게 보관하는 방법과 그것이 당신과 사용자들에게 매우 중요한 이유에 대한 논의를 위해  Securing Your Private Key 를 반드시 읽어라. 특히, 당신이 키를 생성하고 있을 때, 당신은 키스토어와 키 모두를 위해 강한 비밀번호strong password를 선택해야만 한다.


 Keytool Option

 Description

 -genkey

 키 쌍을 생성한다( 공용 키, 개인 키 ) 
 -v

 verbose 출력을 활성화한다.

 -alias <alias_name>  키에 대한 별명. 8 개의 문자만이 사용된다. 
 -keysize <size>

 각각의 생성된 키의 크기( bits ). Keytool 은 1024 bits 의 기본 키 크기를 사용한다. 일반적으로 우리는 2048 bits 이상을 사용하는 것을 추천한다.

 -dname <name >

 누가 키를 생성했는지를 기술하는 구별 가능한 이름. 이 값은 자체 서명 인증서에서 발행인issuer과 제목 필드로 사용된다.

 커맨드 라인에서 이 옵션을 지정할 필요는 없다. 만약 제공되지 않으면, Jarsigner 는 당신에게 구별 가능한 이름 필드들( CN, OU 등 )을 입력하기 위해 당신에게 묻는다.

 -keypass <password>

 키에 대한 비밀번호.

 보안 예방책으로, 커맨드 라인에서 이 옵션을 포함하지 말라. 만약 제공되지 않으면, Keytool 이 비밀번호를 입력하기 위해 당신에게 묻는다. 이러한 방식으로, 당신의 비밀번호가 당신의 쉘 히스토리에 저장되지 않게 된다.

 -validity <valdays>

 키를 위한 일단위 유효 기한.

 주의 : 10000 이상의 값을 추천한다.

 -keystore <keystorename>.keystore

 개인 키를 포함하는 키스토어를 위한 이름.
 -storepass <password>

 키스토어를 위한 비밀번호.

 보안 예방책으로, 커맨드 라인에서 이 옵션을 포함하지 말라. 만약 제공되지 않는다면, Keytool 이 비밀번호를 입력하기 위해 당신에게 묻는다. 이러한 방식으로, 당신의 비밀번호가 쉘 히스토리에 저장되지 않게 된다.

 -keyalg <alg>

 키를 생성할 때 사용할 암호화 알고리즘. DSA 와 RSA 가 지원된다.


아래에 개인 키를 생성하는 keytool 명령의 예가 나와 있다 :



위의 예제 명령을 실행하면, keytool 은 키스토어와 키에 대한 비밀번호를 제공하고 키를 위한 구별 가능한 이름 필드들을 제공하기 위해 당신에게 묻는다. 그리고 나서 그것은 my-release-key.keystore 라는 파일로 키스토어를 생성한다. 그 키스토어와 키는 당신이 입력한 비밀번호로 보호된다. 그 키스토어는 단일 키와 10000 일 동안의 유효 기한을 포함한다. 별명은 당신이 나중에 응용프로그램을 서명할 때 이 키스토어를 참조하기 위해서 사용하게 될 이름이다.


Keytool 에 대한 더 많은 정보를 원한다면, http://docs.oracle.com/javase/6/docs/technotes/tools/windows/keytool.html 에 있는 문서를 참조하라.


2. Compile the application in release mode( 릴리스 모드에서 응용프로그램 컴파일하기 )


사용자에게 응용프로그램을 릴리스하기 위해서, 당신은 그것을 릴리스 모드로 컴파일해야만 한다. 릴리스 모드에서, 컴파일된 응용프로그램은 기본적으로 서명되지 않으며, 당신은 개인 키를 사용해 그것을 서명할 필요가 있을 것이다.


주의 : 당신은 서명되지 않은 응용프로그램이나 디버그 키로 서명된 응용프로그램을 릴리스할 수 없다.


With Eclipse


서명되지 않은 APK 를 Eclipse 에서 익스포트하기 위해서는, Package Explorer 에서 프로젝트를 오른쪽 클릭하고, Android Tools > Export Unsigned Application Package 를 선택하라. 그리고 나서 서명되지 않은 APK 를 위한 파일 위치를 지정하라. ( 그렇지 않으면, AndroidManifest.xml 파일을 Eclipse 에서 열어서, Manifest 탭을 선택하고, Export an unsigned APK 를 클릭하라. )


당신은 Export Wizard 를 사용해서 컴파일과 서명을 합칠 수 있다. Compiling and signing with Eclipse ADT 를 참조하라.


With Ant


당신이 Ant 를 사용하고 있다면, ant 명령을 release 옵션과 함께 사용해 릴리스 모드를 활성화할 수 있다. 예를 들어, 만약 당신이 build.xml 을 포함하고 있는 디렉토리에서 Ant 를 실행하고 있다면, 그 명령은 다음과 같을 것이다 :



기본적으로, 빌드 스크립트는 응용프로그램 APK 를 서명하지 않은 채로 컴파일한다. 프로젝트의 bin/ 에서의 출력 파일은 <your_project_name>-unsigned.apk 일 것이다. 응용프로그램 APK 는 여전히 서명되지 않았기 때문에, 당신은 반드시 수동적으로 개인 키를 사용해 서명하고 zipalign 을 사용해 정렬해야만 한다.


그런데 당신이 키스토어와 키 별명의 이름에 대한 경로를 프로젝트의 ant.properties 파일에다가 제공해 놓았다면, Ant 빌드 스크립트는 서명과 정렬을 수행할 수 있다. 이 정보를 제공하면, 빌드 스크립트는 ant release 를 수행할 때 당신의 키스토어와 별명 비밀번호를 입력받는 창을 띄운다. 그것은 패키지에 서명을 하고 그것을 정렬할 것이다. bin/ 의 최종 출력 파일은 <your_project_name>-release.apk 가 될 것이다. 이 단계들이 자동화되면, 당신은 3 과 5 의 수동 프로시저를 건너 뛸 수 있다. ant.properties 파일에 키스토어와 별명을 지정하는 방법에 대해서 배우고 싶다면, Building and Running Apps on the Command Line 을 참조하라.


3. Sign your application with your private key( 개인 키로 응용프로그램 서명하기 )


서명될 준비가 된 응용프로그램 패키지를 가지고 있을 때, 당신은 Jarsigner 툴을 사용해서 그것에 서명할 수 있다. Basic Setup 에서 설명했듯이, 당신의 머신에서 이용 가능한 Jarsigner 를 가지고 있는지 확인하라. 또한 개인키를 포함하는 키스토어가 이용 가능한지 확인하라.


응용프로그램에 서명하기 위해서, 당신은 Jarsigner 를 실행하는데, 응용프로그램의 APK 와 APK 를 서명하기 위한 개인 키를 포함하는 키스토어를 모두 참조하게 된다. 아래 표는 당신이 사용할 수 있는 옵션을 보여 준다.


 Jarsigner Option  Description 

 -keystore <keystore-name>.keystore

 개인 키를 포함하는 키스토어의 이름.
 -verbose

 verbose 출력을 가능하게 함.

 -sigalg  APK 를 서명하는데 사용하기 위한 서명 알고리즘의 이름. MD5withRSA 를 사용하라.
 -digestalg

 APK 의 엔트리들을 처리하는 과정에 사용하게 될 message digest algorithm. SHA1 을 사용하라.

 -storepass <password>

 키스토어를 위한 비밀번호.

 보안 예방책으로, 당신이 보안 컴퓨터에서 작업하고 있지 않은 한은 커맨드 라인에서 이 옵션을 포함하지 말라. 만약 제공되지 않으면, Jarsigner 가 비밀번호를 입력하기 위해 당신에게 묻는다. 이러한 방식으로, 당신의 비밀번호가 당신의 쉘 히스토리에 저장되지 않게 된다.

 -keypass <password>

 개인 키를 위한 비밀번호.

 보안 예방책으로, 당신이 보안 컴퓨터에서 작업하고 있지 않은 한은 커맨드 라인에서 이 옵션을 포함하지 말라. 만약 제공되지 않으면, Jarsigner 가 비밀번호를 입력하기 위해 당신에게 묻는다. 이러한 방식으로, 당신의 비밀번호가 당신의 쉘 히스토리에 저장되지 않게 된다.


아래에 위의 예제에서 생성된 키스토어를 사용해 my_application.apk 라는 응용프로그램 패키지를 서명하기 위해 Jarsigner 를 사용하는 방법이 있다.



위의 예제를 실행하면, Jarsigner 는 키스토어와 키에 대한 비밀번호를 제공하기 위해 당신에게 묻는다. 그리고 나서 현재의 APK 를 수정하며, 그것은 APK 가 이제 서명되었음을 의미한다. 다른 키를 사용해 여러 번 APK 에 서명할 수 있다는 것에 주목하라.


주의 : JDK 7 부터, 기본 서명 알고리즘이 변경되었는데, APK 에 서명을 할 때 당신이 서명 알고리즘과 다이제스트 알고리즘을( -sigalg 와 -digestalg ) 지정하도록 요구하고 있다.


서명된 APK 를 검증하기 위해서, 당신은 다음과 같은 명령을 사용할 수 있다 :



만약 APK 가 적절하게 서명되었다면, Jarsigner 는 "jar verified" 를 출력한다. 만약 좀 더 세부적인 것을 우너한다면, 다음 명령들을 시도해 볼 수 있다 :



혹은



위에서 -certs 옵션을 가진 명령은 누가 키를 생성했는지를 기술하는 "CN=" 라인을 보여 줄 것이다.


주의 : 만약 당신이 "CN=Android Debug" 라는 것을 보게 된다면, 이것은 APK 가 안드로이드 SDK 에 의해 생성된 디버그 키로 서명되었음을 의미한다. 만약 응용프로그램을 릴리스하려는 의도라면, 당신은 반드시 디버그 키 대신에 개인 키를 사용해서 서명해야만 한다.


Jarsigner 에 대한 더 많은 정보를 원한다면, http://docs.oracle.com/javase/6/docs/technotes/tools/windows/jarsigner.html 의 문서를 참조하라.


4. Align the final APK package( 최종 APK 패키지 정렬하기 )


개인키로 서명된 APK 를 확보했으면, zipalign 을 파일에 대해 실행하라. 이 툴은 모든 비압축 데이터가 파일의 시작부분에 대해 상대적인 특별한 바이트에 정렬되는 것을 보장한다. 4 바이트 경계에서 정렬을 보장하는 것은 디바이스 상에서 설치될 때 성능 최적화를 제공한다. 정렬되어 있다면, 심지어 그것들이 정렬 제약을 가진 이진 데이터를 포함하더라도, 안드로이드 시스템은 모든 데이터를 패키지로부터 복사하는 대신에 파일을 mmap() 을 사용해서 읽어들일 수 있다. 이것의 효과는 응용프로그램을 실행함으로써 소비되는 RAM 의 양을 줄이는 것이다.


zipalign 툴은 안드로이드 SDK 와 함께 제공되며, tools/ 디렉토리 내부에 있다. 서명된 APK 를 정렬하려면, 다음을 실행하라 :



-v 플래그는 ( 선택적인 ) verbose 출력을 켠다. 4 는 바이트 정렬( 4 아닌 다른 값을 사용하지 말라 )이다. 첫 번째 인자는 당신의 서명된 .apk 파일( 입력 )이며, 두 번째 파일은 대상 .apk 파일( 출력 )이다. 만약 당신이 현존하는 APK 를 override 했다면, -f 플래그를 추가하라.


주의 : 당신의 입력 APK 는 zipalign 을 사용해 패키지를 최적화하기 전에 반드시 개인 키로 서명되어 있어야만 한다. 만약 zipalign 을 사용한 후에 서명을 하면, 그것은 정렬을 취소할 것이다.


더 많은 정보를 원한다면, zipalign 툴에 대해 읽어 보라.


Compile and sign with Eclipse ADT( Eclipse ADT 를 사용해 컴파일하고 서명하기 )


만약 Eclipse 를 ADT 플러그인과 함께 사용하고 있다면, Export Wizard 를 사용해서 서명된 APK 를 익스포트할 수 있다( 그리고 필요하면 키스토어도 새로 생성할 수 있다 ). Export Wizard 는 Keytool 과 Jarsigner 와의 모든 상호작용을 당신을 위해 해 준다. 이는 위에서 언급했던 컴파일, 서명, 정렬 등을 위한 수동 프로시저들을 수행하는 대신에 GUI 를 사용해 패키지에 서명할 수 있도록 해 준다. 일단 마법사가 당신의 패키지를 컴파일하고 서명하면, 그것은 zipalign 을 사용해 패키지 정렬도 수행한다. Export Wizard 는 Keytool 과 Jarsigner 를 모두 사용하기 때문에, 당신은 당신의 컴퓨터에서 그것에 접근할 수 있다는 것만 보장하면 된다; Basic Setup for Signing 에서 언급했듯이...


Eclipse 에서 서명된 APK 를 생성하기 위해서는 :


  1. Package Explorer 에서 프로젝트를 선택하고 File > Export 를 선택한다.
  2. Android 폴더를 열고, Export Android Application 을 선택하고, Next 를 클릭한다.
    Export Android Application 마법사가 시작되는데, 그것은 응용프로그램을 서명하는 절차로 안내해 줄 것이고, APK 를 서명하기 위한 개인 키를 선택하기 위한 단계도 포함할 것이다( 혹은 새로운 키스토어와 개인키를 생성할 수도 있다 ).
  3. Export Wizard 를 완료하면, 당신의 응용프로그램이 컴파일되고, 서명되고, 배포 준비가 될 것이다.


Securing Your Private Key( 개인키 보호하기 )



개인 키의 보안을 유지하는 것은 당신이나 사용자에게 있어서 매우 중요하다. 만약 누군가가 당신의 키를 사용하도록 허용하거나, 당신이 키스토어와 비밀번호를 서드 파티가 찾고 이용할 수 있는 보호되지 않은 위치에다가 남겨 두게 되면, 당신의 저작관과 사용자에 대한 신뢰가 위태롭게 된다.


서드 파티가 당신의 인지나 승인없이 당신의 키를 취할 수 있다면, 그 사람은 당신의 원본 응용프로그램들을 악의적으로 대체하고 그것들을 변질시키는 응용프로그램들을 서명하거나 배포할 수 있다. 또한 그러한 사람은 당신의 신분을 이용해 다른 응용프로그램이나 시스템 자체를 공격하거나 사용자의 데이터를 변질시키거나 훔치는 응용프로그램들을 서명하거나 배포할 수도 있다.


당신의 개발자로서의 평판은 그 키가 만료될 때까지 항상 적절하게 개인 키를 보호하느냐에 달려 있다. 여기 키 보안을 지키기 위한 몇 가지 팁들이 있다 :


  • 키스토어와 키에 대해서 강한 비밀번호를 선택하라.
  • Keytool 을 사용해 키를 생성할 때, -storepass 와 -keypass 옵션을 커맨드라인에서 제공하지 말라. 만약 그렇게 한다면, 당신의 비밀번호들이 쉘 히스토리에서 이용 가능하며, 그것은 당신의 컴퓨터에 로그인한 사용자라면 모두 접근할 수 있다.
  • 비슷하게, 응용프로그램에 Jarsigner 를 사용해서 서명할 때, -storepass 와 -keypass 옵션을 커맨드라인에서 제공하지 말라.
  • 누구에게도 개인 키를 주거나 빌려 주지 말라. 그리고 권한을 가지지 않은 사람들이 당신의 키스토어와 키의 비밀번호를 알 수 있도록 하지 말라.


일반적으로, 당신이 키를 생성하고 사용하고 저장할 때, 일반적인 예방책을 따른다면, 그것은 보호된 상태로 남아 있을 수 있을 것이다.


  1. 역주 : symbolic link [본문으로]

+ Recent posts