← Назад к вопросам
Как работают сертификаты безопасности?
1.8 Middle🔥 171 комментариев
#Теория тестирования
Комментарии (1)
🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Принцип работы сертификатов безопасности
Сертификаты безопасности, чаще всего в контексте SSL/TLS, работают по принципу асимметричной криптографии и системы доверия, обеспечивая три ключевые функции: аутентификацию сервера, шифрование передаваемых данных и целостность информации.
Основные компоненты и этапы работы
- Асимметричное шифрование (публичный и приватный ключи)
* Сервер владеет парой ключей: **приватный ключ** (секретный, хранится в безопасности) и **публичный ключ** (свободно распространяется).
* Данные, зашифрованные публичным ключом, могут быть расшифрованы только соответствующим приватным ключом, и наоборот.
- Сертификат и цепочка доверия
* Сам сертификат — это цифровой документ, который связывает публичный ключ сервера с его идентификацией (доменным именем). Он подписан **Центром сертификации (Certificate Authority, CA)**.
* Браузеры и ОС заранее имеют список доверенных корневых CA (хранилище доверенных корневых сертификатов).
* Цепочка доверия: Корневой CA → Промежуточный CA → Сертификат сервера. Подпись каждого предыдущего звена проверяет легитимность следующего.
Процесс установления безопасного соединения (TLS Handshake)
Упрощенная последовательность шагов при подключении клиента (браузера) к защищенному серверу (https://):
- Client Hello: Клиент отправляет серверу запрос, включая поддерживаемые версии TLS и шифры.
- Server Hello: Сервер отвечает, выбирая версию TLS и шифр, и отправляет свой SSL-dертификат (с публичным ключом внутри).
- Проверка сертификата клиентом:
* Клиент проверяет срок действия сертификата.
* Проверяет, соответствует ли имя в сертификате запрошенному домену.
* **Проверяет цифровую подпись CA**, просматривая цепочку до доверенного корневого сертификата. Это ключевой этап аутентификации сервера.
- Генерация сессионного ключа:
* Клиент генерирует случайный **сессионный ключ** (симметричный, для высокой скорости шифрования данных).
* Он шифрует этот сессионный ключ публичным ключом сервера из сертификата и отправляет зашифрованное сообщение серверу.
- Расшифровка сессионного ключа сервером:
* Только сервер, обладающий соответствующим приватным ключом, может расшифровать это сообщение и получить сессионный ключ.
- Начало безопасного обмена:
* И клиент, и сервер теперь используют общий **сессионный ключ** для симметричного шифрования всего последующего трафика (HTTP-запросы, ответы, данные).
# Пример проверки сертификата с помощью OpenSSL в терминале
openssl s_client -connect google.com:443 -showcerts
Эта команда отобразит цепочку сертификатов, информацию об издателе (CA), срок действия и использованные алгоритмы.
Роль в тестировании (QA Automation)
Для автоматизатора понимание сертификатов критически важно при:
- Настройке тестовых окружений: Умение работать с самоподписанными сертификатами (self-signed) в dev/stage средах.
- Написании автотестов для API: Обработка SSL--ертификатов в библиотеках (например,
requestsв Python илиRestAssuredв Java). - Обходе проверок сертификатов в тестах (с осторожностью, только в изолированных средах).
# Пример отключения проверки сертификата в Python requests для тестовой среды
import requests
# ВНИМАНИЕ: Только для не-продакшен окружений!
response = requests.get('https://test-env.internal', verify=False)
# Или указание пути к custom CA bundle
response = requests.get('https://test-env.internal', verify='/path/to/custom/cert.pem')
// Пример настройки доверия к самоподписанному сертификату в Java (TestNG/RestAssured)
import io.restassured.RestAssured;
import javax.net.ssl.*;
import java.security.cert.X509Certificate;
public class SSLTests {
@BeforeTest
public void disableSSLVerification() {
// Настройка доверенного менеджера, который принимает все сертификаты
TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
public java.security.cert.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());
RestAssured.useRelaxedHTTPSValidation();
}
}
Ключевые выводы
- Сертификаты обеспечивают доверие через иерархическую подпись уполномоченными Центрами сертификации.
- TLS handshake использует асимметричное шифрование для безопасной передачи сессионного ключа, который затем используется для быстрого симметричного шифрования данных.
- Для автоматизатора важно не только понимать теорию, но и уметь практически управлять сертификатами в тестовых фреймворках, обеспечивая безопасность и обходя ограничения в контролируемых не-продакшен окружениях.