SSL (Secure Sockets Layer) и TLS (Transport Layer Security) — это криптографические протоколы, обеспечивающие защищённую передачу данных между клиентом и сервером по сети. Они шифруют весь трафик, предотвращая перехват и модификацию данных злоумышленниками. По данным Google Transparency Report (2025), более 95% всего мобильного трафика в мире использует TLS-шифрование. Без этого протокола любая информация, отправленная через открытый Wi-Fi или мобильную сеть, может быть прочитана третьими лицами. Cloudflare, 2024
Главное
SSL (Secure Sockets Layer) — это протокол, разработанный компанией Netscape в 1995 году для защиты веб-трафика. Первая версия SSL 1.0 никогда не публиковалась, SSL 2.0 (1995) и SSL 3.0 (1996) использовались до начала 2000-х, но содержали критические уязвимости. На смену SSL пришёл TLS (Transport Layer Security) — улучшенная версия, стандартизированная IETF. TLS 1.0 (1999) был основан на SSL 3.0, а последующие версии TLS 1.1 (2006), TLS 1.2 (2008) и TLS 1.3 (2018) постепенно отходили от оригинальной архитектуры, добавляя новые алгоритмы шифрования и устраняя уязвимости. Сегодня SSL считается устаревшим, и все современные системы используют TLS, хотя по инерции оба протокола часто упоминаются вместе как SSL/TLS.
История SSL/TLS началась с потребности в безопасной передаче данных в раннем вебе. В 1994 году компания Netscape разработала SSL 1.0 для своего браузера Navigator, но протокол никогда не был опубликован из-за серьёзных проблем безопасности. SSL 2.0 вышел в 1995 году и использовался на практике, однако содержал множество уязвимостей: отсутствие защиты от Man-in-the-Middle, слабые алгоритмы шифрования и уязвимость к truncation-атакам. SSL 3.0 (1996) исправил большинство проблем, но к 2014 году в нём была обнаружена уязвимость POODLE, после чего IETF официально объявила все версии SSL устаревшими. TLS 1.0–1.3 последовательно улучшали криптографическую стойкость, производительность и конфиденциальность, причём TLS 1.3 сократил handshake с двух round-trips до одного, что критически важно для мобильных приложений с нестабильным соединением.
Handshake — это процесс установки защищённого соединения между клиентом и сервером. Он состоит из нескольких последовательных шагов, в ходе которых стороны согласовывают версию протокола, выбирают алгоритмы шифрования, обмениваются ключами и аутентифицируют друг друга. В TLS 1.3 handshake занимает всего одно сетевое взаимодействие (1-RTT), в то время как в TLS 1.2 требовалось два (2-RTT).
Первым шагом клиент отправляет ClientHello — сообщение, содержащее список поддерживаемых версий TLS, набор шифров (cipher suites) и случайное число. Сервер отвечает ServerHello с выбранной версией и шифром, своим сертификатом X.509 и цифровой подписью. Клиент проверяет сертификат через цепочку центров сертификации (CA), генерирует сессионный ключ и отправляет его, зашифрованный открытым ключом сервера из сертификата. После подтверждения сервером начинается защищённая передача данных. Весь handshake выполняется за 1–3 миллисекунды на современных устройствах, что делает его незаметным для пользователя.
Основой TLS-аутентификации является инфраструктура открытых ключей (PKI), построенная на сертификатах формата X.509. Каждый сертификат содержит: доменное имя (Common Name или Subject Alternative Name), публичный ключ сервера, имя издателя (Certificate Authority), срок действия и цифровую подпись CA. Клиент проверяет сертификат сервера по цепочке доверия: от сертификата сервера до корневого CA, сертификат которого встроен в операционную систему. На устройствах Android корневые сертификаты хранятся в системном хранилище, обновляемом через Google Play Services; в iOS — через iOS Updates. При нарушении любого звена цепочки (просроченный сертификат, несовпадение домена, неизвестный CA) клиент разрывает соединение. Для самоподписанных сертификатов (используемых в разработке) требуется явное доверие — в Android через Network Security Config, в iOS через NSExceptionDomains в Info.plist. Процесс валидации цепочки сертификатов включает также проверку статуса отзыва через CRL (Certificate Revocation List) или OCSP (Online Certificate Status Protocol), хотя на мобильных устройствах OCSP-запросы часто пропускаются для ускорения соединения — это компромисс между безопасностью и производительностью, который следует учитывать архитекторам.
Хотя термины SSL и TLS часто используются как синонимы, между ними есть принципиальные технические различия, которые влияют на безопасность и производительность мобильных приложений.
| Характеристика | SSL 3.0 | TLS 1.2 | TLS 1.3 |
|---|---|---|---|
| Год выпуска | 1996 | 2008 | 2018 |
| Статус | Устарел (RFC 7568) | Активен (рекомендован) | Актуален (наилучший) |
| Round-trips | 2 | 2 | 1 |
| Алгоритм обмена ключами | RSA | RSA, ECDHE | ECDHE (только) |
| Аутентифицированное шифрование | Нет | GCM, CCM | AEAD обязателен |
| Perfect Forward Secrecy | Нет | Опционально | Обязательно |
Главное отличие TLS 1.3 от предшественников — обязательное использование Perfect Forward Secrecy (PFS) через протокол ECDHE. Это означает, что даже если злоумышленник получит доступ к закрытому ключу сервера, он не сможет расшифровать ранее перехваченный трафик. Для мобильных приложений, где взлом сервера — реальная угроза, TLS 1.3 с PFS является обязательным требованием безопасности.
Устаревшие версии SSL и TLS имеют документально подтверждённые уязвимости, которые делают их непригодными для продакшен-использования. POODLE (CVE-2014-3566) атакует SSL 3.0 через padding oracle, позволяя расшифровать cookie сессии за 256 запросов. BEAST (CVE-2011-3389) эксплуатирует уязвимость TLS 1.0 в CBC-режиме через предсказуемый IV. Heartbleed (CVE-2014-0160) — не уязвимость протокола, а баг в реализации OpenSSL, позволяющий читать память сервера: по данным Netcraft, в 2014 году было уязвимо более 500 тысяч серверов. Начиная с Android 10 (API 29) и iOS 13, все перечисленные протоколы отключены на уровне системы. Тем не менее, разработчикам следует проверять конфигурацию сервера через SSL Labs Test (qualys.com) перед запуском приложения, чтобы убедиться в отсутствии устаревших cipher suites и поддержке TLS 1.3.
В мобильных приложениях TLS защищает данные на трёх уровнях: шифрование содержимого (никто, кроме сервера, не может прочитать данные), проверка целостности (данные не могут быть изменены в пути) и аутентификация сервера (клиент уверен, что соединяется именно с нужным сервером). Особенно критична аутентификация: без неё злоумышленник может подменить сервер через DNS-спуфинг или поддельную точку доступа Wi-Fi.
Согласно исследованию Google Play Protect (2024), 76% Android-приложений используют TLS корректно с проверкой сертификатов. Оставшиеся 24% допускают ошибки: отключают проверку сертификатов для тестирования (и забывают включить в production), используют самоподписанные сертификаты без валидации или разрешают устаревшие протоколы SSL 3.0 и TLS 1.0. Apple App Transport Security (ATS) в iOS требует TLS 1.2 минимум с 2017 года, а начиная с iOS 15 — использует TLS 1.3 по умолчанию для всех сетевых запросов. Для дополнительной защиты рекомендуется также внедрять Certificate Pinning — привязку к конкретному сертификату сервера.
Рассмотрим пример настройки безопасного HTTPS-соединения в Android с использованием OkHttp — одной из самых популярных библиотек для работы с сетью. Правильная конфигурация включает принудительное использование TLS 1.3 и проверку сертификатов.
val client = OkHttpClient.Builder()
.connectionSpecs(
listOf(
ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
.tlsVersions(TlsVersion.TLS_1_3, TlsVersion.TLS_1_2)
.cipherSuites(
CipherSuite.TLS_AES_128_GCM_SHA256,
CipherSuite.TLS_AES_256_GCM_SHA384,
CipherSuite.TLS_CHACHA20_POLY1305_SHA256
)
.build()
)
)
.hostnameVerifier { hostname, session ->
SSLSession.DefaultHostnameVerifier.verify(hostname, session)
}
.build()
В этом примере мы ограничиваем набор поддерживаемых версий TLS только протоколами 1.3 и 1.2, исключая устаревшие TLS 1.0/1.1. Cipher suites выбираются из современных алгоритмов с AEAD-режимом и обязательной Perfect Forward Secrecy. HostnameVerifier проверяет соответствие имени хоста сертификату. Для iOS аналогичная настройка выполняется через конфигурацию URLSession с параметром tlsMinimumSupportedProtocolVersion, где указывается .TLSv13. Дополнительно на iOS можно задать tlsMaximumSupportedProtocolVersion для ограничения верхней границы версий — это полезно для совместимости с устаревшими серверами, которые ещё не перешли на TLS 1.3. Такая конфигурация гарантирует максимальный уровень безопасности при передаче данных в мобильном приложении.
Часто задаваемые вопросы
TLS — это более новая и безопасная версия протокола. SSL устарел и не должен использоваться (RFC 7568). На практике оба термина обозначают HTTPS-шифрование, но технически все современные системы работают через TLS 1.2 или 1.3.
Установите прокси-инструмент Burp Suite или Charles Proxy и перехватите трафик приложения. Если соединение использует HTTPS и сертификат валиден — приложение использует TLS. Если трафик идёт по HTTP — шифрование отсутствует.
Для продакшен-сборок разрешены только TLS 1.2 и TLS 1.3. Протоколы SSL 3.0, TLS 1.0 и TLS 1.1 должны быть отключены на сервере и в клиентском приложении. С 2020 года основные платформы (Android, iOS, браузеры) требуют TLS 1.2 как минимум.
Да, рекомендуется. TLS проверяет сертификат через цепочку центров сертификации, но если какой-либо CA-центр будет скомпрометирован (что уже происходило с DigiNotar в 2011), злоумышленник сможет выпустить поддельный сертификат. Pinning добавляет дополнительный слой проверки.
TLS 1.3 сокращает время установки соединения с 2 round-trips до 1, что даёт выигрыш 30–50% при первом подключении. Для мобильных приложений с нестабильным соединением (метро, поезда) это критически важно для скорости загрузки данных.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также