Self-signed сертификат — SSL/TLS-сертификат, подписанный не сторонним удостоверяющим центром (CA), а самим владельцем сервера. Технически выполняет те же криптографические функции, что и обычный TLS-сертификат, но браузеры не доверяют ему автоматически — пользователь получает предупреждение «Небезопасное соединение» при первом подключении.
Как работает Self-signed сертификат
Обычный TLS-сертификат подписан цепочкой доверия: корневой CA → промежуточный CA → сертификат сайта. Браузер доверяет корневым CA, встроенным в Root Store операционной системы или браузера. Self-signed сертификат разрывает эту цепочку: его подписывает тот же ключ, что и в поле Subject — издатель и субъект совпадают. Браузер не находит сертификат в Root Store и выдаёт предупреждение ERR_CERT_AUTHORITY_INVALID.
Создание self-signed сертификата командой OpenSSL: openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -sha256 -days 365 -nodes -subj "/CN=example.com". Поле SAN (Subject Alternative Names) обязательно с 2017 года — браузеры игнорируют поле CN. Генерация с SAN: openssl req -x509 ... -addext "subjectAltName=DNS:example.com,DNS:*.example.com,IP:192.168.1.1".
Инструмент mkcert (filippo.io/mkcert) упрощает процесс: автоматически создаёт локальный CA, добавляет его в Root Store браузеров macOS/Linux/Windows и генерирует сертификаты для localhost/локальных доменов. Устанавливается командой mkcert -install, после чего mkcert example.local создаёт доверенный сертификат без предупреждений.
История
Self-signed сертификаты существуют с момента создания SSL в 1994 году. Изначально это был обычный способ развёртывания HTTPS для внутренних инструментов — понятие «удостоверяющий центр» только формировалось. С коммерциализацией интернета в конце 1990-х и появлением VeriSign, Thawte, GeoTrust возникла инфраструктура PKI (Public Key Infrastructure). Let's Encrypt (2014) сделал подписанные CA сертификаты бесплатными и автоматизированными — это окончательно вытеснило self-signed для публичных сайтов.
В 2020 году CA/Browser Forum и браузеры ограничили максимальный срок действия любых сертификатов — 398 дней. Это правило распространяется и на self-signed при их использовании с публичными браузерами.
Когда используют Self-signed
- Внутренние сервисы — панели управления, мониторинг (Grafana, Zabbix), внутренние API на серверах в закрытой сети.
- Разработка и тестирование — локальный HTTPS без покупки сертификата;
mkcert localhostдля front-end разработки. - Корпоративный PKI — компания создаёт собственный корневой CA с помощью HashiCorp Vault PKI или Easy-RSA, устанавливает его во все корпоративные устройства через MDM (Active Directory GPO, JAMF). Self-signed от внутреннего CA работают без предупреждений для всех сотрудников.
- IoT и встраиваемые устройства — маршрутизаторы, NAS, принтеры, где нет внешнего доменного имени.
- Межсервисное взаимодействие (mTLS) — mutual TLS между микросервисами в закрытой сети, где каждый сервис имеет свою пару ключей.
Риски и ограничения
Предупреждение браузера не только отпугивает пользователей — оно создаёт реальный риск безопасности: пользователь, привыкший «принимать исключение», не отличит легитимный self-signed от сертификата атакующего (Man-in-the-Middle). HSTS (HTTP Strict Transport Security) не работает с self-signed в продакшне. Автоматические инструменты (curl, wget) по умолчанию отказываются от self-signed сертификатов — нужен флаг -k или --insecure.
На что обращать внимание
Для публичных сайтов self-signed сертификаты неприемлемы. Используйте бесплатный Let's Encrypt — он поддерживает ACME-автоматизацию через Certbot. Для внутренних сервисов на VDS настройте корпоративный CA с помощью mkcert или HashiCorp Vault PKI. Срок действия не должен превышать 398 дней. Никогда не отключайте проверку сертификатов в продакшн-коде (verify=False в Python requests, NODE_TLS_REJECT_UNAUTHORIZED=0).