← Назад к вопросам

Как работает TLS?

2.8 Senior🔥 111 комментариев
#Безопасность

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как работает TLS (Transport Layer Security)

TLS — криптографический протокол, обеспечивающий безопасное шифрование данных при передаче по сети. Это эволюция старого SSL протокола.

1. Назначение TLS

TLS решает три критические задачи:

  • Конфиденциальность — зашифровать данные так, чтобы только получатель мог их прочитать
  • Аутентификация — подтвердить, что сервер действительно тот, за кого себя выдаёт
  • Целостность — убедиться, что данные не были изменены при передаче

2. Архитектура TLS

TLS состоит из двух слоёв:

TLS Handshake Protocol — установление соединения
TLS Record Protocol — передача зашифрованных данных

3. TLS Handshake — процесс рукопожатия

Это сложный процесс согласования параметров шифрования:

Клиент                           Сервер
   |                               |
   |--- ClientHello ------------->|
   |     (версия, cipher suites)   |
   |                               |
   |<--------- ServerHello ---------|
   |     (выбранный cipher suite)   |
   |                               |
   |<----- Certificate (публичный ключ сервера)
   |                               |
   |<----- ServerKeyExchange ------|
   |<----- ServerHelloDone -------|
   |                               |
   |--- ClientKeyExchange ------->|
   |     (master secret зашифрован)|
   |                               |
   |--- ChangeCipherSpec -------->|
   |--- Finished ----------------->|
   |                               |
   |<----- ChangeCipherSpec -------|
   |<----- Finished ----------------|
   |                               |
   ===== Защищённое соединение ====

4. Асимметричное шифрование (RSA, ECDHE)

На этапе handshake используется асимметричное шифрование:

// Пример: Сервер имеет пару ключей
private RSAPrivateKey serverPrivateKey;  // Только у сервера
public RSAPublicKey serverPublicKey;     // Публично доступен

// 1. Клиент отправляет ClientKeyExchange, зашифрованный публичным ключом
byte[] clientSecret = encryptWithPublicKey(masterSecret, serverPublicKey);

// 2. Сервер расшифровывает приватным ключом
byte[] decrypted = decryptWithPrivateKey(clientSecret, serverPrivateKey);

5. Симметричное шифрование (AES)

После handshake используется симметричное шифрование (быстрое):

// После согласования session key
SecretKey sessionKey = deriveSessionKey(masterSecret);
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, sessionKey);

// Все данные шифруются этим ключом
byte[] encryptedData = cipher.doFinal(plaintext);

6. Certificate (Сертификат)

Сервер отправляет X.509 сертификат для аутентификации:

Сертификат содержит:
- Публичный ключ сервера
- Информацию об сервере (CN, O, OU)
- Цифровую подпись Certification Authority (CA)
- Срок действия
// Проверка сертификата в Java
SSLContext sslContext = SSLContext.getInstance("TLSv1.3");
sslContext.init(keyManagerFactory.getKeyManagers(), 
                trustManagerFactory.getTrustManagers(), 
                new SecureRandom());

SSLSocketFactory factory = sslContext.getSocketFactory();
SSLSocket socket = (SSLSocket) factory.createSocket(host, port);

7. HMAC — обеспечение целостности

Для проверки, что данные не изменены:

message = plaintext + HMAC(plaintext, session_key)

// При получении:
receivedHMAC = extracted_hmac(message);
computedHMAC = HMAC(plaintext, session_key);
assert receivedHMAC.equals(computedHMAC);

8. Версии TLS и их различия

SSL 3.0     — устаревший (взломан)
TLS 1.0     — старый (взломан, deprecated)
TLS 1.1     — слабый (deprecated)
TLS 1.2     — современный стандарт
TLS 1.3     — новейший (2018), быстрее и безопаснее

9. TLS 1.3 улучшения

  • 0-RTT (Zero Round Trip Time) — клиент может отправить данные до завершения handshake
  • Только AEAD шифры — убраны слабые шифры
  • Более быстрый handshake — меньше сообщений
  • Forward Secrecy — каждое сообщение шифруется уникальным ключом

10. Практическое применение в Java

// HTTPS клиент с TLS
HttpsURLConnection connection = (HttpsURLConnection) new URL("https://example.com").openConnection();
connection.setRequestMethod("GET");

// Настройка TLS версии
SSLContext sslContext = SSLContext.getInstance("TLSv1.3");
sslContext.init(null, null, new SecureRandom());

HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());

int responseCode = connection.getResponseCode();

11. Проблемы и уязвимости

  • HEARTBLEED — утечка памяти в OpenSSL
  • POODLE — downgrade атака на SSL 3.0
  • Certificate Pinning — привязка к конкретному сертификату
  • Man-in-the-Middle (MITM) — если клиент не проверяет сертификат

12. Чеклист безопасности

  • Используйте TLS 1.2 или выше (preferably 1.3)
  • Отключите старые версии (SSL, TLS 1.0, 1.1)
  • Используйте strong ciphers (AES-256-GCM)
  • Проверяйте сертификаты (не игнорируйте ошибки)
  • Обновляйте фреймворки и криптографические библиотеки
  • Certificate Pinning для critical приложений

TLS — основа безопасности современного интернета. Java полностью поддерживает TLS через встроенные классы SSL/TLS.