Let's Encrypt — бесплатный удостоверяющий центр, выдающий TLS-сертификаты автоматически. С 2016 — де-факто стандарт для 90 % не-enterprise сайтов. Ниже — минимальный, но прод-готовый гайд по настройке nginx + LE на Ubuntu 24.04, за 10 минут работы.
В итоге получим: HTTP → HTTPS редирект, актуальный TLS-сертификат, автопродление за 30 дней до истечения, HSTS, современные ciphers.
Предусловия
До начала работы должно быть:
- VPS с публичным IP (Ubuntu 24.04 в примерах).
- Домен, указывающий A-записью на этот IP (
example.com+www.example.com). - 80 и 443 порты открыты в firewall (ufw allow 80,443/tcp).
- DNS уже отработал (проверить:
dig +short example.com).
Шаг 1. Установить nginx и certbot
certbot — официальный CLI Let's Encrypt. Плагин python3-certbot-nginx умеет автоматически править nginx-конфиг.
sudo apt update
sudo apt install -y nginx python3-certbot-nginx
sudo systemctl enable --now nginx
# проверка
curl -I http://localhost # HTTP/1.1 200 OK, Server: nginx/1.24.xШаг 2. Минимальный nginx-конфиг под домен
Создаём server-block. В /etc/nginx/sites-available/example.com:
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}Шаг 3. Активировать и создать веб-корень
Симлинк в sites-enabled, папка с индексом, reload nginx.
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo mkdir -p /var/www/example.com
echo "<h1>Hello from Elistrax VPS</h1>" | sudo tee /var/www/example.com/index.html
sudo nginx -t # syntax check
sudo systemctl reload nginx
# проверка снаружи
curl -I http://example.com # HTTP/1.1 200 OKШаг 4. Получить сертификат Let's Encrypt
Certbot сам проверит домен через HTTP-01 challenge, получит сертификат, впишет его в nginx-конфиг, настроит HTTP→HTTPS редирект.
sudo certbot --nginx \
-d example.com -d www.example.com \
--email [email protected] \
--agree-tos \
--no-eff-email \
--redirect
# проверка
curl -I https://example.com # HTTP/2 200
curl -I http://example.com # HTTP/1.1 301 → https://Шаг 5. Автопродление
На современных Ubuntu — таймер systemd от пакета certbot уже настроен. Проверяем.
sudo systemctl list-timers | grep certbot
# certbot.timer ... твин каждый день в ~04:00
# принудительная проверка renewal
sudo certbot renew --dry-runШаг 6. Продакшн-конфиг с HSTS и современными ciphers
Дефолт от certbot безопасен, но можно ужесточить. Правим /etc/nginx/sites-available/example.com:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# современный набор ciphers, TLS 1.2+ / 1.3
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;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
# HSTS — 1 год, с preload-опцией
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# безопасные заголовки
add_header X-Content-Type-Options nosniff always;
add_header X-Frame-Options DENY always;
add_header Referrer-Policy strict-origin-when-cross-origin always;
location / {
try_files $uri $uri/ =404;
}
}
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}HSTS с preload — необратимо на 6+ месяцев. Не включайте на дев-доменах: если истечёт сертификат, браузеры откажутся заходить вообще.
Проверка рейтинга TLS
После деплоя прогоняем сайт через SSL Labs — качественный TLS-стек должен дать A или A+.
# в браузере
open "https://www.ssllabs.com/ssltest/analyze.html?d=example.com"
# или через CLI (без публичных сервисов):
curl -sI https://example.com | grep -i strict
sudo nmap --script ssl-enum-ciphers -p 443 example.com | head -30