Как обновлять сертификаты у пользователей с устаревшими сертификатами, чтобы они могли использовать приложение?
Что проверяют
Какой сертификат вы имеете в виду и понимаете ли, что сломанный канал нельзя починить через него же. Хороший ответ начинается с уточнения: речь о SSL pinning, о клиентском сертификате для mTLS или о сертификатах подписи приложения. Следом спрашивают, как вы спланировали бы ротацию заранее.
Как отвечать
- SSL pinning: чаще всего вопрос про него. Пинить стоит не листовой сертификат, а хэш открытого ключа (SPKI) и держать в приложении запасной пин ключа, который выпустят следующим. Тогда перевыпуск сертификата на сервере не ломает старые версии. Пины задаются в
Info.plistчерезNSPinnedDomainsили вручную вurlSession(_:didReceive:completionHandler:)с проверкой черезSecTrustEvaluateWithError; - ротация: сначала релиз с новым пином, затем ожидание, пока его установит большинство, и только потом смена ключа на сервере. Сроки сертификатов сокращаются: по решению CA/Browser Forum публичный TLS-сертификат с марта 2026 года живёт не больше 200 дней, дальше срок будет уменьшаться;
- принудительное обновление: эндпоинт с минимальной поддерживаемой версией, доступный и тем, у кого пин устарел. Если проверка не прошла, пользователь видит экран «Обновите приложение» со ссылкой в App Store, а не безликую сетевую ошибку;
- клиентский сертификат (mTLS): храните identity в Keychain, следите за датой окончания и обновляйте заранее: новая пара ключей, CSR на сервер, получение сертификата, пока старый ещё действует. Если он уже истёк, пользователь проходит повторную аутентификацию другим способом, например по логину и одноразовому коду.
Где спотыкаются
Пинят листовой сертификат без запасного. При первом же плановом перевыпуске все установленные версии перестают работать до обновления.
Предлагают скачать новый пин с того же сервера. Если соединение отвергается из-за старого пина, скачать ничего не выйдет, канал обновления должен работать независимо.
Путают с сертификатом распространения Apple. Его истечение не отключает приложения, уже установленные из App Store, в отличие от корпоративной программы Enterprise, где приложения действительно перестают запускаться.