Комментарии (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.