Перейти к содержанию

Установка 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