SSL/TLS сертификаты: как работает HTTPS
SSL/TLS — протокол шифрования, который защищает данные при передаче между браузером и сервером. SSL/TLS проверку (HTTP over TLS) сегодня является стандартом для всех сайтов: браузеры помечают HTTP-сайты как небезопасные, а поисковики учитывают HTTPS как фактор ранжирования.
SSL vs TLS — в чём разница
SSL (Secure Sockets Layer) — оригинальный протокол, созданный Netscape в 1990-х. TLS (Transport Layer Security) — его современный наследник. SSL 2.0 и 3.0 давно устарели и уязвимы. Сегодня актуальны:
| Протокол | Год | Статус |
|---|---|---|
| SSL 2.0 | 1995 | Запрещён (уязвим) |
| SSL 3.0 | 1996 | Запрещён (POODLE) |
| TLS 1.0 | 1999 | Устарел (отключён в браузерах с 2020) |
| TLS 1.1 | 2006 | Устарел (отключён в браузерах с 2020) |
| TLS 1.2 | 2008 | Поддерживается (минимально рекомендуемый) |
| TLS 1.3 | 2018 | Рекомендуемый (быстрее, безопаснее) |
Термин «SSL-сертификат» используется по привычке, хотя технически правильнее «TLS-сертификат».
Как работает TLS-хэндшейк
При установке HTTPS-соединения клиент и сервер проходят процедуру TLS-хэндшейка:
- Client Hello — клиент отправляет поддерживаемые версии TLS, шифры и случайное число
- Server Hello — сервер выбирает версию TLS и шифр, отправляет свой сертификат
- Проверка сертификата — клиент проверяет цепочку доверия, срок действия, соответствие домена
- Обмен ключами — стороны согласовывают сессионный ключ (обычно через ECDHE)
- Шифрованное соединение — дальнейший обмен данными зашифрован сессионным ключом
TLS 1.3 упрощает этот процесс до одного раунда (1-RTT), а при повторном подключении может установить соединение за 0-RTT.
Типы сертификатов
По уровню проверки
| Тип | Проверка | Для кого |
|---|---|---|
| DV (Domain Validation) | Только владение доменом | Блоги, небольшие сайты, стартапы |
| OV (Organization Validation) | Домен + существование организации | Бизнес-сайты, корпоративные проверку портов |
| EV (Extended Validation) | Полная проверка организации | Банки, финансовые сервисы, крупный бизнес |
По количеству доменов
- Обычный — для одного домена (example.com)
- Wildcard — для домена и всех поддоменов (*.example.com)
- Multi-Domain (SAN) — для нескольких разных доменов в одном сертификате
Let's Encrypt
Бесплатный центр сертификации, выдающий DV-сертификаты. Поддерживается всеми браузерами. Сертификаты действуют 90 дней и автоматически обновляются через certbot:
# Установка certbot
apt install certbot python3-certbot-nginx
# Получение сертификата
certbot --nginx -d example.com -d www.example.com
# Проверка автоматического обновления
certbot renew --dry-run
Certbot автоматически настроит nginx для HTTPS и добавит cron-задачу для обновления.
Цепочка доверия
Сертификат вашего сайта подписан промежуточным сертификатом (intermediate), который подписан корневым (root). Браузер доверяет корневым CA из своего хранилища:
Root CA (в хранилище браузера)
└── Intermediate CA (R3)
└── Ваш сертификат (example.com)
Важно: сервер должен отдавать полную цепочку (сертификат + intermediate). Если intermediate отсутствует, некоторые клиенты не смогут проверить сертификат.
Распространённые ошибки
ERR_CERT_DATE_INVALID
Сертификат истёк или ещё не начал действовать. Решение: обновить сертификат, проверить настройку автообновления, убедиться что время на сервере корректное.
ERR_CERT_COMMON_NAME_INVALID
Домен в адресной строке не совпадает с CN или SAN сертификата. Типичный случай: сертификат для example.com не покрывает www.example.com.
ERR_CERT_AUTHORITY_INVALID
Цепочка доверия не может быть проверена. Причины: самоподписанный сертификат, отсутствует промежуточный сертификат, CA не в хранилище браузера.
NET_ERR_CERT_REVOKED
Сертификат отозван центром сертификации. Необходимо получить новый сертификат.
Mixed Content
Страница загружена по HTTPS, но содержит ресурсы по HTTP. Браузер может блокировать такие ресурсы. Решение: все URL должны использовать HTTPS или протокол-относительные пути (//).
Оптимальная конфигурация nginx
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# Протоколы
ssl_protocols TLSv1.2 TLSv1.3;
# Шифры
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
# HSTS
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
}
Проверка SSL-сертификата
Для проверки сертификата из командной строки:
# Информация о сертификате
openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates -subject -issuer
# Проверка цепочки
openssl s_client -connect example.com:443 -servername example.com -showcerts
Проверьте ваш сайт прямо сейчас
Проверить →