APK는 이전 버전과 동일한 인증서로 서명되어야합니다.


200

얼마 전에 내 앱을 Google Play에 업로드했습니다 (Android 마켓이라고 불렸을 때).

오늘 앱을 업데이트했지만 이전 키 저장소를 삭제하고 새 키 저장소를 작성했습니다.
업로드 할 때 APK는 이전 버전과 동일한 인증서로 서명해야합니다.

업로드 실패

다른 인증서로 서명 된 APK를 이전 APK에 업로드했습니다. 동일한 인증서를 사용해야합니다.

기존 APK는 지문이있는 인증서로 서명됩니다.
[SHA1 : 89 : 2F : 11 : FE : CE : D6 : CC : DF : 65 : E7 : 76 : 3E : DD : A7 : 96 : 4F : 84 : DD : BA : 33]
및 업로드 한 APK에 서명하는 데 사용 된 인증서에는 지문이 있습니다.
[SHA1 : 20 : 26 : F4 : C1 : DF : 0F : 2B : D9 : 46 : 03 : FF : AB : 07 : B1 : 28 : 7B : 9C : 75 : 44 : CC]

그러나이 인증서가 없으며 활성 사용자가 있기 때문에 응용 프로그램을 삭제하고 다시 게시하고 싶지 않습니다.

새 인증서로 앱에 서명하려면 어떻게해야합니까?


26
다른 문제가 있습니다. 앱을 업그레이드하려고했지만이 오류가 계속 표시됩니다. 사실, 나는 키 스토어를 바꾸지 않았다! 어떡해?!?
Mariux

어떻게 해결 했습니까?
엘리자베스

@ int_32 어떻게 해결합니까 ??
Sharma를

답변:


187

아무것도. 설명서 읽기 : Android 마켓에 업데이트 게시

업데이트 된 애플리케이션을 업로드하기 전에 매니페스트 파일의 요소에서 android : versionCode 및 android : versionName 속성을 증가시켜야합니다. 또한 패키지 이름이 같아야하고 .apk에 동일한 개인 키로 서명해야합니다. 패키지 이름 및 서명 인증서가 기존 버전의 인증서와 일치하지 않으면 Market은이를 새 응용 프로그램으로 간주하여 사용자에게 업데이트로 제공하지 않습니다.


14
좋은 대답입니다. 키가 손실되면 앱을 업데이트 할 수 없다는 것을 결코 알지 못했습니다. 안전한 장소에 키를 백업해야합니다.
Peter Knego

18
내가 정상적으로하는 것은 키 저장소 파일을 svn에 저장하는 것입니다. 트렁크 / 태그 / 분기와 함께 credential이라는 새 폴더를 넣고 키 저장소 파일을 저장합니다. 키 저장소 파일을 나타내는 새 .txt 파일도 추가하십시오. 키 저장소는 소스 코드만큼 중요합니다 . 당신이 그것을 분실 (또는 비밀 번호를 잊어 버렸습니다) 일단 끝장 .. 있습니다
Krishnabhadra

42
제발 하지 마십시오 @Krishnabhadra 말한대로, 소스 제어에 키 스토어 암호 (또는 그 문제에 대한 모든 암호)를 확인. 키 저장소와 비밀번호를 별도로 유지하고 비밀번호를 안전하게 유지하십시오.
Christopher Orr

1
뭐?! 그러나 그것은 단지 내 키가 너무 오래되었다고 말해서 삭제하고 새로운 키를 만들었습니다.

2
@iwayneo 빌드 시스템에서 디버그 키가 너무 오래 되었다고 말했을 수 있지만 Google Play에서 2033 년 10 월 이전에 만료되는 키를 거부해야하므로 릴리스 키로 발생했을 가능성은 거의 없습니다 .
Christopher Orr

126

실수로 디버그 키로 서명 했습니까?

Google Play에서는 디버그 키 저장소로 서명 된 앱을 게시 할 수 없습니다. 이러한 APK를 업로드하려고하면 "디버그 모드로 서명 된 APK를 업로드했습니다. APK를 릴리스 모드로 서명해야합니다"라는 메시지와 함께 Google Play가 실패합니다.

그러나 디버그 키 저장소로 서명 된 업데이트 를 업로드하려고하면 이 메시지 가 표시 되지 않습니다 . Google Play는 SHA1 지문을 참조하여 질문에 표시된 메시지를 표시합니다.

먼저 실수로 디버그 키로 앱에 서명했는지 확인하십시오.


사용 된 서명 키를 어떻게 확인합니까?

APK에서 정보를 수집

Java를 사용하여 다음 명령을 사용하여 원래 APK 및 업데이트 APK에 서명 된 인증서를 확인할 수 있습니다 keytool.

keytool -list -printcert -jarfile original.apk
keytool -list -printcert -jarfile update.apk

다음은 APK 서명 방식에 대한 자세한 정보를 보여줍니다.

Owner: CN=My App, O=My Company, L=Somewhere, C=DE
Issuer: CN=My App, O=My Company, L=Somewhere, C=DE
Serial number: 4790b086
Valid from: Mon Nov 11 15:01:28 GMT 2013 until: Fri Mar 29 16:01:28 BST 2041
Certificate fingerprints:
  MD5:  A3:2E:67:AF:74:3A:BD:DD:A2:A9:0D:CA:6C:D4:AF:20
  SHA1: A6:E7:CE:64:17:45:0F:B4:C7:FC:76:43:90:04:DC:A7:84:EF:33:E9
  SHA256: FB:6C:59:9E:B4:58:E3:62:AD:81:42:...:09:FC:BC:FE:E7:40:53:C3:D8:14:4F
         Signature algorithm name: SHA256withRSA
         Version: 3

여기서주의해야 할 중요한 부분 (각 APK에 대해)은 SHA1 지문 값, 소유자 신원 값 및 유효 시작 날짜 까지 입니다.


해당 keytool명령이 작동하지 않으면 ( -jarfile옵션에 Java 7 필요) 다음 jarsigner명령을 통해보다 기본적인 정보를 얻을 수 있습니다 .

jarsigner -verify -verbose:summary -certs original.apk
jarsigner -verify -verbose:summary -certs update.apk

불행히도 SHA1 지문은 표시되지 않지만 인증서 만료 날짜와 함께 X.509 소유자 ID가 표시됩니다. 예를 들면 다음과 같습니다.

sm  4642892 Thu Apr 17 10:57:44 CEST 2014 classes.dex (and 412 more)

    X.509, CN=My App, O=My Company, L=Somewhere, C=DE
    [certificate is valid from 11/11/13 12:12 to 29/03/41 12:12]
    [CertPath not validated: Path does not chain with any of the trust anchors]

인증서 체인 또는 타임 스탬프에 대한 경고와 함께 "CertPath not validated"메시지는 무시해도됩니다. 이 경우에는 관련이 없습니다.

APK간에 소유자, SHA1 및 만료 값을 비교하십시오.

  • 소유자 인 경우 / X.509 식별 값이 CN=Android Debug, O=Android, C=US, 당신은 당신과 함께 APK에 서명 한 디버그 키 가 아닌 원래 릴리스 키

  • 만약 SHA1의 지문 값이 원래 및 업데이트 된 APK와 다른, 당신은 않았다 없는 모두의 APK에 대해 동일한 서명 키를 사용하여

  • 경우] 소유자 / X.509 식별 값이 다른, 또는 인증서 만료 날짜가 두 APK가 사이에 차이가, 당신은 않았다 없는 모두의 APK에 대해 동일한 서명 키를 사용하여

두 인증서간에 Owner / X.509 값이 동일하더라도 이는 지문 값과 같이 일치하는 항목이없는 경우 인증서가 동일하다는 것을 의미하지는 않습니다.


원래 키 저장소를 검색하고 백업을 확인하십시오.

두 APK에 서로 다른 인증서 정보가있는 경우 있는 경우 원래 키 저장소, 즉 Google Play (또는 keytool)가 말한 첫 번째 SHA1 지문 값을 가진 파일을 찾아야 합니다.

올바른 SHA1 지문이있는 파일이있을 때까지 컴퓨터 및 모든 백업에서 찾을 수있는 모든 키 저장소 파일을 검색하십시오.

keytool -list -keystore my-release.keystore

그냥 누르면 Enter비밀번호를 묻는 메시지가 표시되면을 . SHA1 값을 빠르게 확인하려면 비밀번호를 입력 할 필요가 없습니다.


어디에서든 원래 키 저장소를 찾을 수 없습니다

원래 키 저장소를 찾을 수 없으면 절대 이 특정 앱에 대한 업데이트를 게시 할 수 .

Android는 애플리케이션 서명 페이지 에서이를 명시 적으로 언급 합니다.

경고 : 키 저장소와 개인 키를 안전하고 안전한 곳에 보관하고 안전한 백업을 유지하십시오. 앱을 Google Play에 게시 한 다음 앱에 서명 한 키를 잃어버린 경우 항상 동일한 키로 앱의 모든 버전에 서명해야하므로 앱에 대한 업데이트를 게시 할 수 없습니다.

APK의 첫 번째 릴리스 이후 모든 후속 릴리스는 정확히 동일한 키로 서명해야합니다.


원본 APK에서 원본 서명 키를 추출 할 수 있습니까?

아니요. 불가능합니다. APK에는 공개 키만 포함되며 개인 키 정보는 포함되지 않습니다.


새로운 서명 키로 마이그레이션 할 수 있습니까?

원본을 찾더라도 A 키로 APK에 서명 한 다음 A 키와 B 키로 다음 업데이트에 서명 한 다음 B 키로 만 다음 업데이트에 서명 할 수 없습니다.

여러 키로 APK (또는 JAR 파일)에 서명하는 것은 기술적으로 가능하지만 Google Play는 더 이상 여러 서명이있는 APK를 허용하지 않습니다.

이렇게하면 "APK에 여러 개의 인증서로 서명되었습니다. 하나의 인증서로만 서명하고 다시 업로드하십시오"라는 메시지가 나타납니다.


어떡해?

새로운 애플리케이션 ID (예 : "com.example.myapp"에서 "com.example.myapp2"로 변경)를 사용하여 앱을 빌드하고 Google Play에서 새로운 업체 정보를 만들어야합니다.

사람들이 기존 앱이 설치되어 있어도 새 앱을 설치할 수 있도록 코드를 변경해야 할 수도 있습니다. 예를 들어 콘텐츠 제공자가 충돌하지 않는지 확인해야합니다.

기존 설치 기반, 리뷰 등을 잃게되며 기존 고객이 기존 앱을 제거하고 새 버전을 설치하도록하는 방법을 찾아야합니다.

이 버전에 사용하는 키 저장소와 비밀번호를 안전하게 백업하십시오.


디버그 (실제로 검색 중)를 확인하기 위해 명령을 시도했지만 항아리에 타임 스탬프가 포함되지 않은 서명이 포함되어 있다는 오류를 반환합니다. 이 스레드를 사용하여 내 APK를 만들었습니다 : stackoverflow.com/questions/16622843/…
CularBytes

@RageCompex 출력이없고 오류 만 발생합니까? 해당 명령을 실행할 때 타임 스탬프 경고 (오류가 아님)도 표시됩니다. X.509 출력을 얻는 한 필요한 전부입니다.
Christopher Orr

예, X.509 출력을 얻으므로 문제가되지 않습니다. 무엇에 대한 [CertPath not validated: Path does not chain with any of the trust anchors], 아니 문제 eather? 나는 내 이름을 볼 수 CN있으므로 제대로 서명 한 것 같습니다 :)
CularBytes

@RageCompex "사용 된 서명 키 확인"섹션에서 이미 답변했습니다.
Christopher Orr

나는 오늘 작은 심장 마비를 일으켰다. 숨겨진 키 저장소를 파악하기 위해이 명령 줄을 사용했습니다. 고마워요! 당신은 저를 구했습니다 ... 정말 : D
Ajeet

11

아무것도 아님-Google은 애플리케이션에 서명하는 데 사용되는 키로 애플리케이션이 식별되었다고 분명히 말합니다. 따라서 키를 잃어버린 경우 새 응용 프로그램을 만들어야합니다.


1
@ 스포츠 그들은 당신을 경고합니다. 큰 빨간주의 경고 메시지 : developer.android.com/tools/publishing/...
크리스토퍼 오어

2
@sports 어쨌든 동일한 개발자 계정에 둘 이상의 앱을 게시 할 수 있으므로 다시 지불 할 필요가 없습니다.
Christopher Orr

7

오늘 나는 같은 문제에 직면했지만 불행히도 키 스토어 파일에 두 개의 별칭이있었습니다.여기에 이미지 설명을 입력하십시오


7

방금 맑은 파랑에서 이런 일이 발생했습니다. 나는 내가 아무것도 바꾸지 않았다고 생각합니다.

그러나 Build => Clean Project수정했습니다.


1
흠, 나는 1 주일을 보냈고 가능한 모든 것을했다. "WTF"라고 말할 때가되었지만 도움이 된 것은 유일합니다. (또한 도움이되지 않은 캐시 무효화를 시도했습니다.) 감사합니다
Upsilon42

1
이 문제는 1 시간 동안 미쳤던 문제를 해결했습니다.
Boris Legovic

이것에 감사합니다; 실제 생명의 은인입니다!
Ian Mbae

나는 이것이 관련이 보이지 않습니다.
무한 루프

고마워!. 실수로 다른 키 저장소 파일과 자격 증명으로 서명 된 apk를 생성하여 업로드했습니다. 올바른 키 저장소로 APK를 업로드 한 후에도 동일한 오류가 발생했습니다. 무효화 캐시, 안드로이드 스튜디오 및 PC 재시작으로 한 시간 동안 새로운 릴리스를 만든 후 마침내 수정되었습니다.
Arun

5

여기 나는 그 질문에 대한 답을 얻는다. 너무 오랫동안 검색 한 후에 마침내 이것에 대한 키와 암호를 해독합니다. 내 키와 별칭도 jks 파일을 잊었지만 다행히도 내가 넣은 암호를 알고 있습니다. 그러나 올바른 조합을 찾는 것이 가장 어려운 작업이었습니다.

솔루션-다운로드-Keytool IUI 버전 2.4.1 플러그인 여기에 이미지 설명을 입력하십시오

창이 팝업되면 별칭 이름이 표시됩니다. jks 파일이 올바른 경우 .. 별칭을 마우스 오른쪽 버튼으로 클릭하고 "인증서 체인보기"를 누르십시오. SHA1 키가 표시됩니다. Google 앱 스토어에서 APK를 업로드하는 동안 ...

일치하면 올바른 jks 파일과 별칭이 있습니다 ..

이제 운이 좋은 암호가 많이 있습니다 .. 여기에 이미지 설명을 입력하십시오

이제이 scrren으로 이동하여 동일한 jks 경로를 .. 및 password (사용중인 암호 중) "인증서 파일"

화면에 오류가 표시되면 암호가 일치하지 않습니다 .. 오류가 표시되지 않으면 올바른 jks 파일이 있음을 의미합니다. 올바른 별칭과 비밀번호 ()를 사용하여 apk를 Play 스토어에 업로드 할 수 있습니다 :)


개인 키를 잃어 버렸고 이런 식으로 검색 할 수 있었습니까? 대답이 예인 경우 도구를 다운로드 할 위치를 링크 할 수 있습니까? 그리고 앱을 어떻게 열 수 있습니까?
LS_

4

당신과 함께 이전 apk 파일이있는 경우 (backup) jarSigner를 사용하여 해당 apk에서 인증서를 추출한 다음 해당 키를 사용하거나 keytool을 사용하여 해당 인증서를 복제하십시오. 도움이 될 수 있습니다 ... 유용한 링크는 jarsigner 문서keytool 문서입니다 .


5
"..jarSigner를 사용하여 해당 APK에서 인증서를 추출하십시오"-어떻게해야합니까?
Rubycon

14
그것은 당신이 APK에 다시 서명해야 할 개인 키를 복구하지 않습니다.
botteaap

APK는 동일한 개인 키로 서명해야합니다
om252345

3

Keystore Explorer ( https://keystore-explorer.org/ )를 추천 합니다. 키 스토어를 Google Play에 업로드하지 않고도 액세스 할 수 있습니다. 이렇게하면 암호를 잘못 입력했는지 문제를 해결할 수 있습니다.


1

새로운 기능 Google Play 앱 서명을 사용하여 새 키 파일을 생성 할 수 있습니다.

2017 년 5 월 이후 Google Play 스토어는 Play 스토어에 새로운 기능을 추가하며 Android 개발자에게 희소식입니다. 이 기능을 통해 개발자는 KeyStore 파일을 잃은 앱 또는 APK를 업데이트 할 수 있습니다. Play 스토어 콘솔에서 Google Play 앱 서명을 사용하도록 설정해야합니다.

https://support.google.com/googleplay/android-developer/answer/7384423?hl=ko

http://www.geekcodehub.com/2018/05/23/keystore-lost-in-android/


0

별칭 이름을 변경하여 로그인 한 V1 또는 V2와 같은 다른 로그인 방법을 시도한 후 최근 에이 문제에 직면했으며 마지막으로 잘못된 키 저장소 파일을 사용하고 있음을 알게되었습니다.


0

내 [바보] 실수는 app-release.apk 파일 대신 app-debug.apk 파일을 사용했다는 것입니다. 서명 된 APK를 생성 할 때 "빌드 변형"프레임에서 "릴리스"를 선택해야합니다. app-release.apk 파일은 프로젝트 루트의 "app \ release"폴더에 있어야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.