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