Как работает SSL pinning и где хранится сертификат в мобильном приложении?
Что проверяют
Понимаете ли вы, от какой атаки защищает pinning и чем он отличается от обычной проверки цепочки сертификатов. Следом спрашивают, что будет с приложением, когда сервер сменит сертификат, и как вы переживёте это без экстренного релиза.
Как отвечать
Обычный TLS проверяет, что сертификат сервера подписан доверенным центром из системного хранилища. Pinning добавляет второе условие: сертификат или его открытый ключ должен совпасть с тем, что зашит в приложение. Подменный сертификат от прокси или от корня, который установил сам пользователь, тогда не пройдёт, даже если система ему доверяет.
Способы реализации на iOS:
- через делегат: в
urlSession(_:didReceive:completionHandler:)ловитеNSURLAuthenticationMethodServerTrust, берётеserverTrust, сначала проверяете цепочку стандартно черезSecTrustEvaluateWithError, затем сравниваете SHA-256 открытого ключа (SPKI) с эталоном. При совпадении отвечаете.useCredential, иначе.cancelAuthenticationChallenge; - декларативно: с iOS 14 в
Info.plistесть ключNSPinnedDomainsвнутриNSAppTransportSecurity, где задаются хэши ключей листового сертификата или удостоверяющего центра, без кода; - библиотеки: в Alamofire это
ServerTrustManagerсPublicKeysTrustEvaluator, отдельно есть TrustKit.
Где хранится эталон: он едет вместе с приложением. Это файл .cer в бандле или base64-строка с хэшем в коде или в Info.plist. Keychain тут не нужен: сертификат сервера публичен, секрета в нём нет, прятать его бессмысленно.
Практика: пинить ключ, а не сам сертификат, и держать минимум два пина, текущий и запасной ключ, который уже сгенерирован, но ещё не в работе. Тогда ротация не ломает старые версии приложения.
Где спотыкаются
Пинят один листовой сертификат. Сертификаты сейчас живут месяцы, и после продления все установленные версии теряют сеть до обновления из App Store.
Пропускают стандартную проверку цепочки и сравнивают только хэш. Истёкший или отозванный сертификат с тем же ключом тогда проходит.
Считают pinning защитой от реверса. На взломанном устройстве его снимают за минуты через Frida, он защищает пользователя в чужой сети, а не ваш API от исследования.