Что такое TLS?

«Что такое TLS?» — вопрос из категории Сети, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

TLS (Transport Layer Security) — это криптографический протокол, предназначенный для обеспечения безопасной связи между сетевыми приложениями (например, браузером и веб-сервером). Он является преемником устаревшего протокола SSL (Secure Sockets Layer).

Основные цели TLS:

  1. Шифрование: Защита передаваемых данных от прослушивания (конфиденциальность).
  2. Аутентификация: Проверка подлинности сервера (а иногда и клиента) с помощью цифровых сертификатов.
  3. Целостность данных: Гарантия того, что данные не были подменены в пути, с использованием кодов аутентификации сообщений (MAC).

Как это связано с тестированием (QA):

  • Тестирование HTTPS-соединений: Большинство современных API работают по HTTPS (HTTP поверх TLS). Тестировщик должен уметь работать с такими endpoint'ами.
  • Работа с сертификатами: Частая задача — настройка тестового окружения с использованием самоподписанных или корпоративных сертификатов. Необходимо знать, как импортировать их в хранилище доверенных корневых сертификатов (truststore) для инструментов тестирования (Postman, Selenium, кастомные скрипты).
  • Обработка ошибок: Тесты должны корректно обрабатывать и валидировать ошибки, связанные с TLS (например, SSLHandshakeException, CERTIFICATE_VERIFY_FAILED).

Пример настройки доверия к самоподписанному сертификату в Java-коде (для тестов):

// Упрощённый пример: отключение проверки SSL (НЕ для продакшена! Только для тестовых сред!)
import javax.net.ssl.*;
import java.security.cert.X509Certificate;

public class DisableSSLValidation {
    public static void disable() throws Exception {
        TrustManager[] trustAllCerts = new TrustManager[] {
            new X509TrustManager() {
                public X509Certificate[] getAcceptedIssuers() { return null; }
                public void checkClientTrusted(X509Certificate[] certs, String authType) {}
                public void checkServerTrusted(X509Certificate[] certs, String authType) {}
            }
        };
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, new java.security.SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> true);
    }
}