SSL/TLS — криптографические протоколы, шифрующие данные между мобильным приложением и сервером, гарантирующие конфиденциальность и целостность трафика. По данным Apple (2026), App Transport Security блокирует соединения ниже TLS 1.2 по умолчанию на всех устройствах iOS. TLS 1.3 сокращает время рукопожатия в 2 раза по сравнению с TLS 1.2, улучшая UX мобильных приложений.
Главное
SSL (Secure Sockets Layer) и TLS (Transport Layer Security) — криптографические протоколы, обеспечивающие безопасную передачу данных по сети. SSL, разработанный Netscape в 1990-х, признан устаревшим после версии 3.0 из-за уязвимостей POODLE и BEAST. TLS, его преемник, прошёл версии 1.0, 1.1, 1.2 и 1.3 — актуальными считаются только TLS 1.2 и TLS 1.3. Все современные мобильные платформы требуют использования TLS для сетевых соединений, а App Store и Google Play проверяют это на этапе ревью.
Без TLS трафик между приложением и сервером передаётся открытым текстом — любой в той же Wi-Fi-сети может перехватить логины, пароли, токены и персональные данные пользователей с помощью Wireshark или tcpdump. TLS шифрует все передаваемые данные (шифрование на уровне транспорта) и проверяет подлинность сервера через цепочку сертификатов X.509. По данным IETF (2018), TLS 1.3 использует только современные AEAD-шифры (AES-GCM, ChaCha20-Poly1305), исключая устаревшие алгоритмы вроде RC4 и 3DES.
HTTPS (HTTP Secure) — это HTTP поверх TLS. Когда мобильное приложение делает запрос по https://, оно сначала устанавливает TLS-соединение с сервером, а затем передаёт HTTP-заголовки и тело запроса уже через защищённый канал. Без HTTPS ни один серьёзный API не должен работать — это базовая гигиена безопасности. По данным OWASP (2026), незащищённые соединения входят в топ-3 уязвимостей мобильных приложений.
TLS Handshake — процесс установления безопасного соединения между клиентом и сервером. Стороны согласовывают версию протокола, выбирают шифронабор (cipher suite), обмениваются ключами через асимметричную криптографию и проверяют сертификаты. В TLS 1.2 рукопожатие требует 2 Round Trip Time (2 RTT): клиент → сервер с ClientHello, сервер → клиент с ServerHello и Certificate, затем финальные сообщения Finished. TLS 1.3 сокращает этот процесс до 1 RTT.
Первый этап: ClientHello — клиент отправляет поддерживаемые версии TLS, список шифронаборов и случайное число. Сервер отвечает ServerHello, выбирая версию и шифронабор, передаёт свой сертификат X.509 (Certificate) и сообщение ServerHelloDone. Клиент проверяет сертификат через цепочку доверенных центров сертификации (CA), генерирует pre-master secret, шифрует его публичным ключом из сертификата и отправляет серверу в ClientKeyExchange. После этого обе стороны генерируют сессионные ключи и обмениваются сообщениями ChangeCipherSpec и Finished. С этого момента все данные шифруются симметрично.
import Security
let url = URL(string: "https://api.example.com")!
let session = URLSession(configuration: .default,
delegate: self,
delegateQueue: nil)
func urlSession(
_ session: URLSession,
didReceive challenge: URLAuthenticationChallenge,
completionHandler: @escaping (URLSession.AuthChallengeDisposition,
URLCredential?) -> Void
) {
let trust = challenge.protectionSpace.serverTrust
guard let trust else {
completionHandler(.cancelAuthenticationChallenge, nil)
return
}
completionHandler(.useCredential, URLCredential(trust: trust))
}
Пример обработки URLAuthenticationChallenge на iOS через URLSessionDelegate. Этот метод вызывается при каждом TLS Handshake, позволяя приложению кастомно проверить сертификат сервера. Для production-использования добавьте проверку сертификата через SecTrustEvaluateWithError и сравнивайте с заранее сохранённым отпечатком — только после этого вызывайте useCredential.
TLS 1.3 (RFC 8446, 2018) — первое крупное обновление протокола за 10 лет. Основные улучшения: handshake сокращён до 1 RTT (0 RTT для повторных соединений), удалены устаревшие шифронаборы (RSA key exchange, CBC-mode), обязательное совершенное прямое шифрование (PFS) и защита от downgrade-атак через signed transcript. По данным Qualys SSL Labs (2026), TLS 1.3 обеспечивает защиту даже при компрометации долговременного серверного ключа благодаря PFS.
| Характеристика | TLS 1.2 | TLS 1.3 |
|---|---|---|
| Handshake | 2 RTT (полных) | 1 RTT (0 RTT с PSK) |
| Шифронаборы | 30+ комбинаций (RSA, DH, ECDH) | 5 AEAD-наборов (AES-GCM, ChaCha20) |
| Forward Secrecy | Опционально (DHE, ECDHE) | Обязательно (все наборы) |
| Поддержка iOS | iOS 5+ | iOS 12+ |
| Поддержка Android | Android 4.0+ | Android 10+ |
| Устаревшие алгоритмы | RSA, CBC, RC4, 3DES | Удалены полностью |
0-RTT (Zero Round Trip Time) — особенность TLS 1.3, позволяющая клиенту отправлять данные сразу вместе с ClientHello при повторном соединении через PSK (Pre-Shared Key). Это ускоряет загрузку последующих экранов в мобильных приложениях, особенно при частых запросах к одному серверу. Однако данные 0-RTT не защищены от replay-атак — их можно перехватить и отправить повторно. Используйте 0-RTT только для идемпотентных запросов (GET, PUT) без побочных эффектов.
App Transport Security (ATS) — механизм Apple, требующий HTTPS-соединений с TLS 1.2 или выше, включённый по умолчанию с iOS 9. ATS блокирует все HTTP-соединения и HTTPS с TLS ниже 1.2. Разработчик может настроить исключения в Info.plist через NSAppTransportSecurity для конкретных доменов, но Apple рекомендует минимизировать исключения и использовать HTTPS везде. Нарушение требований ATS — причина отклонения приложения на ревью App Store.
<!-- Info.plist — App Transport Security -->
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<false/>
<key>NSExceptionDomains</key>
<dict>
<key>cdn.example.com</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<false/>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
</dict>
</dict>
<key>NSAllowsLocalNetworking</key>
<true/>
</dict>
Конфигурация ATS в Info.plist. NSAllowsArbitraryLoads установлен в false — все соединения обязаны использовать HTTPS. Для домена cdn.example.com задана минимальная версия TLS 1.2, NSAllowsLocalNetworking=true разрешает HTTP для локальной сети (полезно для dev-серверов). Apple настоятельно рекомендует не включать NSAllowsArbitraryLoads без NSExceptionDomains — это должно быть исключение, а не общее правило.
Network Security Config — механизм Android для настройки HTTPS и TLS без изменения кода Java/Kotlin. Конфигурация задаётся в XML-файле network_security_config.xml и подключается в AndroidManifest через атрибут android:networkSecurityConfig. Поддерживает настройку доверенных сертификатов (user и system CA), Certificate Pinning, отключение cleartext HTTP, debug-оверрайды и перенаправление трафика.
<!-- res/xml/network_security_config.xml -->
<network-security-config>
<base-config cleartextTrafficPermitted="false">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
<domain-config cleartextTrafficPermitted="false">
<domain includeSubdomains="true">api.example.com</domain>
<pin-set expiration="2027-01-01">
<pin digest="SHA-256">
47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=
</pin>
</pin-set>
</domain-config>
</network-security-config>
Network Security Config для Android. Base-config запрещает cleartext-трафик и доверяет только системным CA-сертификатам (без пользовательских — защита от установки MitM-сертификатов пользователем). Domain-config для api.example.com содержит pin-set с SHA-256 отпечатком сертификата. Если сертификат сервера изменится до указанной даты expiration, соединение будет отклонено — это жёсткая форма Certificate Pinning.
Certificate Pinning — техника фиксации сертификата или публичного ключа сервера в коде приложения. При каждом TLS Handshake клиент сравнивает сертификат сервера с заранее сохранённым отпечатком (SHA-256 хеш). Даже если злоумышленник получит доверенный CA-сертификат или скомпрометирует центр сертификации, он не сможет провести MitM-атаку — приложение проверит конкретный отпечаток, а не цепочку CA. Это особенно важно для финансовых приложений и приложений с чувствительными данными.
Certificate Pinning требует осторожности: при смене сертификата на сервере все старые версии приложения перестанут соединяться. Рекомендуется хранить несколько запасных отпечатков (основной + резервный), указывать дату истечения pin-set и реализовать fallback-механизм через стандартную CA-проверку. Альтернатива — Trust On First Use (TOFU), когда приложение запоминает сертификат при первом соединении и предупреждает пользователя при его изменении. По данным OWASP (2026), отсутствие Certificate Pinning входит в топ-3 уязвимостей мобильных приложений (M3: Insecure Communication).
В Alamofire 5+ Certificate Pinning настраивается через ServerTrustManager с PinnedCertificatesTrustEvaluator (проверка сертификата целиком) или PublicKeysTrustEvaluator (только публичный ключ). Публичный ключ предпочтительнее — он не меняется при обновлении сертификата у того же CA. Создайте ServerTrustManager со словарём [host: evaluator], передайте его в Session и используйте для всех запросов к защищённым API.
Часто задаваемые вопросы
SSL — устаревший протокол (версии 2.0 и 3.0), признанный небезопасным из-за уязвимостей POODLE и BEAST. TLS — его преемник, начиная с TLS 1.0 (RFC 2246, 1999). Любой современный «SSL-сертификат» — это сертификат X.509, используемый протоколом TLS. SSL 3.0 запрещён во всех современных ОС и браузерах.
App Transport Security — требование Apple к безопасности приложений. HTTP передаёт данные открытым текстом, позволяя перехватить токены и персональные данные пользователей в публичных Wi-Fi-сетях. ATS по умолчанию блокирует HTTP и HTTPS с TLS ниже 1.2, защищая пользователей даже без действий разработчика.
Используйте SSL Labs (ssllabs.com/ssltest) или командную строку: openssl s_client -tls1_3 -connect example.com:443. В большинстве облачных платформ (AWS CloudFront, Cloudflare, Nginx 1.19+, Caddy) TLS 1.3 включён по умолчанию. На Android 10+ поддержка встроена в системный провайдер Conscrypt.
Self-Signed Certificate — сертификат, подписанный самостоятельно, а не центром сертификации. В production использовать нельзя — мобильные ОС не доверяют такому сертификату. Применяется для локальной разработки: добавьте сертификат в доверенные через MDM или используйте debug-сборки с отключённой проверкой.
Создайте ServerTrustManager с PinnedCertificatesTrustEvaluator или PublicKeysTrustEvaluator. Первый проверяет весь сертификат, второй — только публичный ключ (предпочтительнее). Передайте менеджер в Session(configuration: serverTrustManager:) и используйте сессию для всех запросов к API.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также