Вы подписались с помощью ключа отладки по ошибке?
Google Play не позволяет вам публиковать приложение, подписанное вашим хранилищем ключей отладки. Если вы попытаетесь загрузить такой APK, в Google Play произойдет сбой с сообщением «Вы загрузили APK, который был подписан в режиме отладки. Вам нужно подписать свой APK в режиме выпуска».
Однако, если вы попытаетесь загрузить обновление , подписанное с помощью хранилища ключей отладки, вы не увидите это сообщение; В Google Play отобразится сообщение, отображаемое в вопросе со ссылкой на отпечатки пальцев SHA1.
Итак, во-первых, проверьте, не подписали ли вы приложение с помощью ключа отладки по ошибке.
Как проверить, какие ключи подписи были использованы?
Соберите информацию из APK
Вы можете проверить, с какими сертификатами были подписаны исходный APK и обновленный APK, с помощью этих команд, используя Java 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 вместе с датами истечения срока действия сертификата. Например:
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» вместе с предупреждениями о цепочках сертификатов или временных отметках; в данном случае они не актуальны.
Сравните значения Owner, SHA1 и Expiry между APK
Если значение идентификатора Владелец / X.509 равно CN=Android Debug, O=Android, C=US
, то вы подписали APK с помощью отладки ключ , а не исходный ключ разблокировки
Если значение отпечатка пальца SHA1 отличается между исходным и обновленным APK, то вы не использовали один и тот же ключ подписи для обоих APK
Если значения идентификатора Владелец / X.509 различны или даты истечения срока действия сертификата отличаются между двумя APK, то вы не используйте один и тот же ключ подписи для обоих APK
Обратите внимание, что даже если значения Owner / X.509 идентичны между двумя сертификатами, это не означает, что сертификаты идентичны - если что-то еще не совпадает - например, значения отпечатков пальцев - тогда сертификаты различны .
Поиск оригинального хранилища ключей, проверка резервных копий
Если два APK имеют различную информацию о сертификате, то вы должны найти исходное хранилище ключей, то есть файл с первым значением отпечатка пальца SHA1, который вам сказал Google Play (или keytool
).
Поиск по всем файлам хранилища ключей, которые вы можете найти на вашем компьютере, и в любых ваших резервных копиях, пока у вас не появится файл с правильным отпечатком SHA1:
keytool -list -keystore my-release.keystore
Просто нажмите Введите при запросе пароля - вам не обязательно вводить его, если вы просто хотите быстро проверить значение SHA1.
Нигде не могу найти оригинальное хранилище ключей
Если вы не можете найти исходное хранилище ключей, вы никогда не сможете публиковать обновления для этого конкретного приложения.
Android явно упоминает об этом на странице , подписывающей ваше приложение :
Предупреждение: Храните хранилище ключей и закрытый ключ в надежном и безопасном месте и обеспечьте их надежное резервное копирование. Если вы опубликуете приложение в Google Play, а затем потеряете ключ, которым вы подписали свое приложение, вы не сможете публиковать обновления для своего приложения, поскольку вы всегда должны подписывать все версии своего приложения одним и тем же ключом. .
После первого выпуска APK все последующие выпуски должны быть подписаны точно таким же ключом.
Можно ли извлечь исходный ключ подписи из оригинального APK?
Нет. Это невозможно. APK содержит только общедоступную информацию, а не информацию о вашем личном ключе.
Можно ли перейти на новый ключ подписи?
Нет. Даже если вы найдете оригинал, вы не можете подписать APK с ключом A, затем подписать следующее обновление с ключами A и B, а затем подписать следующее обновление только ключом B.
Подписание APK (или любого файла JAR) несколькими ключами технически возможно , но Google Play больше не принимает APK с несколькими подписями.
Попытка сделать это приведет к сообщению «Ваш APK был подписан несколькими сертификатами. Пожалуйста, подпишите его только одним сертификатом и загрузите его снова».
Что я могу сделать?
Вам нужно будет создать приложение с новым идентификатором приложения (например, изменить с «com.example.myapp» на «com.example.myapp2») и создать новый список в Google Play.
Возможно, вам также придется изменить свой код, чтобы люди могли установить новое приложение, даже если у них установлено старое приложение, например вам нужно убедиться, что у вас нет конфликтующих поставщиков контента.
Вы потеряете существующую базу установки, обзоры и т. Д., И вам придется найти способ заставить своих существующих клиентов удалить старое приложение и установить новую версию.
Опять же, убедитесь, что у вас есть безопасные резервные копии хранилища ключей и паролей, которые вы используете для этой версии.