Let's Encrypt — бесплатный и автоматизированный центр сертификации, который позволяет быстро настроить защищённый HTTPS на сервере Ubuntu 20.04 с Nginx. В этом руководстве — пошаговая установка certbot, настройка Nginx, получение сертификатов и их автоматическое обновление.

Установка Let's Encrypt на Ubuntu 20.04

Установка Certbot

Обновляем пакеты и устанавливаем certbot:

sudo apt update
sudo apt install certbot

Создание параметров Диффи-Хеллмана

Для безопасности создадим 2048-битные параметры DH:

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Генерация может занять несколько минут.

Настройка Nginx для проверки Let's Encrypt

Для получения сертификатов через плагин webroot создаём каталог для проверки:

sudo mkdir -p /var/lib/letsencrypt/.well-known
sudo chgrp www-data /var/lib/letsencrypt
sudo chmod g+s /var/lib/letsencrypt

Создаём сниппет для Nginx, чтобы направлять запросы к /.well-known/acme-challenge/:

sudo nano /etc/nginx/snippets/letsencrypt.conf

Вставляем:

location ^~ /.well-known/acme-challenge/ {
  allow all;
  root /var/lib/letsencrypt/;
  default_type "text/plain";
  try_files $uri =404;
}

Создаём сниппет для безопасного SSL с современными настройками:

sudo nano /etc/nginx/snippets/ssl.conf

Вставляем:

ssl_dhparam /etc/ssl/certs/dhparam.pem;

ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;

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:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers on;

ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 30s;

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;

Конфигурация Nginx для домена

Создаём файл конфигурации для сайта:

sudo nano /etc/nginx/sites-available/example.com.conf

Вставляем:

server {
  listen 80;
  server_name example.com www.example.com;

  include snippets/letsencrypt.conf;
}

Активируем сайт:

sudo ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/
sudo systemctl restart nginx

Получение SSL-сертификата

Запускаем certbot с использованием плагина webroot:

sudo certbot certonly --agree-tos --email admin@example.com --webroot -w /var/lib/letsencrypt/ -d example.com -d www.example.com

Настройка HTTPS и редиректов

Редактируем конфигурацию сайта, чтобы настроить HTTPS и редиректы:

sudo nano /etc/nginx/sites-available/example.com.conf

Вставляем:

server {
    listen 80;
    server_name www.example.com example.com;

    include snippets/letsencrypt.conf;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name www.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
    include snippets/ssl.conf;
    include snippets/letsencrypt.conf;

    return 301 https://example.com$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
    include snippets/ssl.conf;
    include snippets/letsencrypt.conf;

    # . . . other code for your site
}

Перезагружаем Nginx:

sudo systemctl reload nginx

Проверь, что сайт доступен по HTTPS с зеленым замком.

Автоматическое обновление сертификатов

Let's Encrypt действует 90 дней. Certbot устанавливает системный таймер для обновления, но нужно перезагружать nginx после обновления.

В файл /etc/letsencrypt/cli.ini:

sudo nano /etc/letsencrypt/cli.ini

Добавь строку:

deploy-hook = systemctl reload nginx

Проверим работу обновления:

sudo certbot renew --dry-run

Если ошибок нет — автоматическое обновление работает корректно.

Вот и всё. Теперь сайт под защитой SSL с Let's Encrypt и Nginx на Ubuntu 20.04, и сертификаты обновляются автоматически.