Установка SSL-сертификата на Nginx¶
Данная инструкция описывает настройку Nginx с SSL для развёртывания 1Форма на bare-metal или виртуальной машине. При использовании Docker-развёртывания смотрите документацию по docker-compose конфигурации.
Варианты сертификатов¶
| Тип | Подходит для | Стоимость |
|---|---|---|
| Let's Encrypt | Публичных доменов с DNS-записью | Бесплатно |
| Коммерческий CA | Корпоративных и wildcard-доменов | Платно |
| Самоподписанный | Внутренних сервисов (dev/test) | Бесплатно |
1. Let's Encrypt через Certbot¶
Установка Certbot¶
# Debian / Ubuntu
apt install certbot python3-certbot-nginx
# RHEL / Rocky / AlmaLinux
dnf install certbot python3-certbot-nginx
Получение сертификата¶
certbot certonly --nginx -d example.com -d www.example.com
Сертификат будет сохранён в /etc/letsencrypt/live/example.com/.
Конфигурация Nginx¶
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
http2 on;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/nginx/ssl.conf; # общие TLS-параметры (см. раздел 3)
# ... остальная конфигурация
}
Автообновление¶
Certbot устанавливает таймер systemd автоматически. Проверить:
systemctl status certbot.timer
# Тест без применения
certbot renew --dry-run
2. Коммерческий сертификат (ручная установка)¶
Подготовка файлов¶
После получения сертификата от CA у вас будет:
example.com.crt — сертификат домена
ca-bundle.crt — цепочка CA
example.com.key — приватный ключ
Объедините сертификат с цепочкой:
cat example.com.crt ca-bundle.crt > /etc/ssl/certs/example.com/fullchain.crt
cp example.com.key /etc/ssl/certs/example.com/private.key
chmod 640 /etc/ssl/certs/example.com/private.key
Конфигурация Nginx¶
ssl_certificate /etc/ssl/certs/example.com/fullchain.crt;
ssl_certificate_key /etc/ssl/certs/example.com/private.key;
3. Общие TLS-параметры (/etc/nginx/ssl.conf)¶
Вынесите общие настройки в отдельный файл и подключайте во всех vhost через include:
# Протоколы
ssl_protocols TLSv1.2 TLSv1.3;
# DH-параметры (генерируются один раз)
# openssl dhparam -out /etc/nginx/dhparam.pem 2048
ssl_dhparam /etc/nginx/dhparam.pem;
# Шифры (профиль Mozilla Intermediate)
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;
# Сессии
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
# HSTS (включить только когда уверены, что HTTPS работает стабильно)
add_header Strict-Transport-Security "max-age=63072000" always;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 1.1.1.1 8.8.8.8 valid=300s;
4. Проверка после установки¶
# Проверить синтаксис конфига
nginx -t
# Перезагрузить без даунтайма
nginx -s reload
# Проверить сертификат (срок, subject)
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
| openssl x509 -noout -dates -subject
# Проверить оценку безопасности онлайн:
# https://www.ssllabs.com/ssltest/
5. Типичные ошибки¶
| Ошибка | Причина | Решение |
|---|---|---|
SSL_ERROR_RX_RECORD_TOO_LONG |
HTTP-трафик попал на 443 | Проверить listen 443 ssl |
certificate verify failed |
Неполная цепочка CA | Добавить CA-bundle в fullchain |
unknown ca |
Самоподписанный сертификат | Установить CA в доверенные |
connection refused на 443 |
Порт закрыт в firewall | ufw allow 443 или firewall-cmd --add-service=https |