hostprofi.ru
Подобрать хостинг
Термин·буква S

Self-signed сертификат

краткое определение

Self-signed сертификат — SSL/TLS-сертификат, подписанный собственным закрытым ключом, а не доверенным центром сертификации. Браузеры показывают предупреждение при его использовании.

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).

Другие термины