Что такое SSL pinning, зачем он нужен и как работает?
Что проверяют
Понимаете ли вы, от чего закрепление защищает, а от чего нет, и готовы ли платить за него эксплуатационную цену. Вопрос любят в командах, где приложение работает с деньгами или медицинскими данными: там это требование, а не выбор.
Как отвечать
Обычная проверка HTTPS доверяет любому корню из системного хранилища. Кто сумел добавить туда свой корень (профиль управления устройством, прокси, скомпрометированный удостоверяющий центр), увидит трафик. SSL pinning сужает доверие: соединение принимается, только если в цепочке есть заранее известный ключ или сертификат.
Как это устроено на практике:
- закрепляют не сертификат, а отпечаток публичного ключа. Сертификат меняется при каждом продлении, ключ живёт дольше;
- пинов всегда минимум два: действующий и запасной, ключ от которого хранится отдельно и ещё не опубликован;
- проверка идёт в делегате сессии, в обработчике запроса аутентификации: сначала стандартная оценка доверия через
SecTrustEvaluateWithError, затем сравнение отпечатка. Своя проверка добавляется к системной, а не заменяет её; - в современных версиях системы то же самое объявляется декларативно в
Info.plist, через список закреплённых доменов, и свой сетевой код трогать не нужно.
Где спотыкаются
Рассказывают, что приложение запоминает сертификат при первом подключении. Это другая модель, доверие при первом контакте, и здесь она бессмысленна: первое соединение может быть уже подслушанным. Отпечатки едут внутри сборки.
Закрепляют один листовой сертификат и не думают про сроки. День, когда сертификат продлили, а старая версия ещё у половины пользователей, превращается в полную недоступность, которую нечем починить с сервера. Отсюда запасной пин, наблюдение за долей старых сборок и принудительное обновление.
Считают закрепление защитой от реверса. На устройстве под контролем исследователя проверка снимается перехватом функции за считанные минуты. Оно защищает канал от чужого посередине, а не секреты внутри приложения, и тем более не заменяет авторизацию на сервере.