SSL/TLS — криптографічні протоколи, що шифрують дані між мобільним додатком і сервером, гарантуючи конфіденційність і цілісність трафіку. За даними Apple (2026), App Transport Security блокує з’єднання нижче TLS 1.2 за замовчуванням на всіх пристроях iOS. TLS 1.3 скорочує час рукостискання вдвічі порівняно з 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також