Что такое SSL Pinning и зачем он нужен?
SSL Pinning — это техника безопасности, используемая в мобильных и веб-приложениях для усиления защиты от атак типа «Man-in-the-Middle» (MitM). Она позволяет убедиться, что клиент (например, мобильное приложение) устанавливает соединение только с доверенным сервером, даже если злоумышленник попытается подделать сертификат через поддельный прокси или скомпрометированный сертификат.
Как работает HTTPS без SSL Pinning
Когда клиент устанавливает HTTPS-соединение, происходит стандартная проверка SSL-сертификата сервера. Эта проверка включает:
Однако система доверия к CA может быть уязвимой. Если злоумышленник сможет добавить собственный CA в систему (например, на скомпрометированном устройстве), он может выдать поддельный, но «доверенный» сертификат и перехватывать трафик.
Что делает SSL Pinning
SSL Pinning добавляет дополнительный уровень проверки: клиент «прикрепляет» (pin) конкретный сертификат или публичный ключ сервера, с которым он должен работать. При попытке подключения к серверу клиент сравнивает полученный сертификат с ранее сохранённым (ожидаемым). Если они не совпадают — соединение отклоняется, даже если сертификат в целом валиден по стандартным правилам HTTPS.
Варианты реализации
Существует два основных подхода к SSL Pinning:
1. Pinning сертификата
Приложение сохраняет сам SSL-сертификат сервера. При подключении сравнивает полученный сертификат с сохранённым.
2. Pinning публичного ключа
Сохраняется не весь сертификат, а его публичный ключ.
Примеры
На Android (Java / Kotlin)
CertificatePinner certificatePinner = new CertificatePinner.Builder()
.add("example.com", "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=")
.build();
OkHttpClient client = new OkHttpClient.Builder()
.certificatePinner(certificatePinner)
.build();
На iOS (Swift)
// URLSessionDelegate метод
func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge,
completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
// Получить серверный сертификат и сравнить с локально сохранённым
}
Преимущества
Недостатки
Лучшие практики
SSL Pinning — мощный инструмент защиты сетевого взаимодействия между клиентом и сервером, особенно в мобильных приложениях и приложениях с высокими требованиями к безопасности. Однако его внедрение требует аккуратного планирования и понимания потенциальных рисков, особенно связанных с управлением жизненным циклом сертификатов.
Эта мера не заменяет HTTPS, но делает его гораздо более устойчивым к целому классу атак.