Вы подписали ключом отладки по ошибке?
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
Просто нажмите, Enterесли будет предложено ввести пароль - вам не обязательно вводить его, если вы просто хотите быстро проверить значение 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.
Возможно, вам также придется изменить свой код, чтобы люди могли установить новое приложение, даже если у них установлено старое приложение, например, вам нужно убедиться, что у вас нет конфликтующих поставщиков контента.
Вы потеряете существующую базу установки, обзоры и т. Д., И вам придется найти способ заставить своих существующих пользователей удалить старое приложение и установить новую версию.
Опять же, убедитесь, что у вас есть безопасные резервные копии хранилища ключей и паролей, которые вы используете для этой версии.