Что происходит при потере ключа подписи приложения и как это влияет на обновление в Play Market
Что проверяют
Понимаете ли вы, что подписей у приложения в магазине две, и участвовали ли в выпуске релизов, а не только в отладочных сборках. Заодно проверяют, различаете ли вы техническую сторону и организационную: бэкапы, доступы, выпуск из CI.
Как отвечать
Сначала разделите ключи. Ключ подписи приложения это тот, которым подписан код на устройстве пользователя: система ставит обновление, только если новая версия подписана им же. Ключ загрузки это тот, которым вы подписываете артефакт перед отправкой в консоль разработчика.
Дальше два сценария:
- подпись ведёт магазин: ключ подписи хранится у него, вы потеряли только ключ загрузки. Его сбрасывают через поддержку, генерируется новый, старый отзывают, обновления не прерываются;
- подпись своя и ключ утерян: подписать новую версию нечем. Единственный выход это новый идентификатор пакета и новая карточка, то есть потеря установок, отзывов, рейтинга и позиций в поиске, а пользователей придётся переводить вручную.
Скажите, что новые приложения публикуются в формате app bundle, а он предполагает подпись на стороне магазина, поэтому у свежих проектов первый сценарий и есть основной. Назовите и профилактику: хранилище ключей в резервной копии отдельно от пароля, доступ не у одного человека, подпись в CI из защищённых секретов.
Где спотыкаются
Путают потерю и компрометацию. Потерянный ключ это про невозможность выпускать обновления, утёкший это про чужие сборки, которые устройство примет как ваши. Меры разные, и ответ про ротацию подходит не к каждому случаю.
Второе: считают, что достаточно подписать новой подписью и пользователь обновится. Установка поверх с другой подписью не проходит, устройство требует сначала удалить приложение, а вместе с ним уходят локальные данные.
Третье: думают, что поддержка магазина восстановит любой ключ. Сбросить можно ключ загрузки, потому что он нужен только для приёма сборок. Ключ, которым уже подписаны установленные копии, магазин подменить не может: его проверяет само устройство.