SSL pinning — это когда приложение доверяет не любому действительному сертификату от любого удостоверяющего центра, а заранее заданному сертификату или открытому ключу сервера, зашитому прямо в код.
Зачем нужен пиннинг
Пиннинг защищает от ситуации, когда соединение подтверждает сертификат, которому формально можно доверять, но он выпущен не для настоящего сервера: подставной удостоверяющий центр, перехват трафика на уровне корпоративной сети или скомпрометированный центр сертификации, выписавший чужой сертификат на нужное имя.
От чего пиннинг не защищает: от взлома самого сервера, от уязвимости в коде приложения и от утечки данных после того, как зашифрованное соединение уже установлено. Он проверяет только то, с кем именно установлено соединение, а не что происходит дальше.
Как обычно работает доверие без пиннинга
Без пиннинга приложение проверяет только одно: подписан ли сертификат сервера одним из центров, которым доверяет операционная система. Любой из сотен таких центров формально равноправен. Приложению безразлично, какой именно центр выпустил сертификат, лишь бы цепочка подписей сходилась к доверенному корню.
Что именно прикрепляют
Прикрепить можно разные части сертификата, и от выбора зависит, насколько часто придётся обновлять приложение.
| Что прикрепляют | Насколько хрупко при продлении сертификата |
|---|---|
| Сертификат целиком | Самый хрупкий вариант: меняется при каждом продлении, даже если ключ остался тем же |
| Открытый ключ | Переживает продление, если ключ не менялся, ломается только при смене самого ключа |
| Промежуточный центр | Устойчивее всего, но защищает слабее — доверие смещается на весь центр целиком |
Главная опасность
При плановой смене сертификата на сервере приложение с устаревшим пиннингом перестаёт соединяться с сервером у всех пользователей одновременно — причём произойдёт это не постепенно, а сразу после переключения сертификата. Починить это можно только обновлением самого приложения, а обновление доходит до пользователей не мгновенно и не до всех.
Именно эта особенность — главная причина, по которой пиннинг часто снимают после первого же болезненного инцидента со сменой сертификата.
Что делают вместо и вместе с пиннингом
Несколько практик снижают риск, не отказываясь от идеи полностью.
Запасной прикреплённый ключ, добавленный заранее, позволяет заменить рабочий сертификат без обновления приложения — доверие остаётся, потому что один из прикреплённых вариантов продолжает совпадать. Срок годности самого пиннинга ограничивают по времени, чтобы устаревшая привязка не осталась в приложении навсегда. На стороне домена похожую по духу защиту даёт CAA-запись: она ограничивает, какие удостоверяющие центры вообще имеют право выпускать сертификат для домена — подробнее в статье CAA-запись DNS.
Когда пиннинг уместен, а когда вреден
Решение зависит от того, кто управляет обновлением клиента и насколько быстро обновления доходят до пользователей.
| Тип приложения | Насколько уместен пиннинг |
|---|---|
| Мобильное приложение банка или платёжного сервиса | Уместен при налаженном запасном ключе и контроле обновлений |
| Массовое потребительское приложение с редкими обновлениями | Рискован: массовый сбой у всех пользователей сразу |
| Внутренний клиент, который сам соединяется с собственным сервером | Удобен — обе стороны контролируются одной командой |
| Обычный сайт, который открывают в браузере | Не применяется: браузер не поддерживает пиннинг под управлением сайта |
Частые вопросы
Что такое SSL pinning простыми словами?
Это способ, при котором приложение доверяет не любому действительному сертификату, а конкретному сертификату или ключу сервера, заранее зашитому в код. Даже формально верный сертификат от другого источника такое приложение примет только в том случае, если он совпадает с прикреплённым образцом.
Нужен ли пиннинг обычному сайту?
Нет, браузеры не предоставляют сайтам возможность задавать свой пиннинг, и обычный сайт полагается на стандартную проверку сертификата операционной системой. Пиннинг применяют в собственных мобильных приложениях и API-клиентах, где разработчик управляет и клиентом, и сервером.
Что будет при продлении сертификата?
Если приложение прикрепило сертификат целиком или ключ, а продление поменяло именно прикреплённую часть, приложение перестанет соединяться с сервером у всех пользователей сразу. Избежать этого помогает заранее добавленный запасной прикреплённый ключ, который переживёт продление.
Чем пиннинг отличается от HSTS?
HSTS заставляет браузер обращаться к сайту только по защищённому соединению и не принимать попытки снизить его до обычного HTTP. Пиннинг — про доверие к конкретному сертификату или ключу внутри уже защищённого соединения, и применяется обычно не в браузере, а в отдельном приложении.
Вывод
Пиннинг стоит добавлять осознанно и вместе с запасным ключом, а не по умолчанию: цена ошибки — полная остановка приложения у всех пользователей сразу. Какие типы сертификатов вообще существуют — в статье типы SSL-сертификатов.