Установка бесплатного SSL сертификата Let's Encrypt

Просмотры: 738
Категория: Администрирование
Создано: 24 ноября 2020
Тэги: Linux Ubuntu

Сегодня редко какой сервер общается с клиентом по незащищённому каналу, через 80-й порт. Такие сервера устанавливают, как правило, локально, где шифровать данные особого смысла не имеет. Другое дело - WWW. Правилом хорошего тона на текущий момент является использование защищённого соединения, чаще всего через 443-й порт Для того, чтобы веб-сервер мог начать работу в таком режиме, необходимо каким-то образом получить SSL сертификаты и указать серверу, где они лежат. Для локальных задач можно использовать самоподписанные сертификаты. Однако, если таким сертификатом пользоваться в интернете, браузер заблокирует показ страниц, закодированных с помощью самоподписанного сертификата. И далеко не каждый пользователь сможет открыть такие страницы. Поэтому возникает задача получения сертификата, подписанного доверенной организацией, известной браузеру. Раньше эта услуга была платной. Теперь с конца 2015 года появилась возможность получить на 90 дней бесплатный криптографический сертификат от открытого Центр Сертификации Let's Encrypt. Я расскажу, как можно получить и установить такой сертификат у себя на сайте. Веб-сервер - Nginx, ОС - Ubuntu Server 18.04.

При выдаче сертификата выполняется проверка домена. Чтобы такая проверка прошла успешно, необходимо либо создать TXT-запись на DNS-сервере, либо использовать привязанный к этому имени web-сервер. Мы рассмотрим второй случай. Его немного труднее конфигурировать чем первый, зато легко настроить на автоматическое обновление сертификата по прошествии 60 дней.

Итак, пусть наш веб-сервер обслуживает домен example.com. Простейшая конфигурация Nginx будет такой (файл nginx.conf)

server {
    listen 80;
    server_name example.com;
    root /var/nginx/html;
}

/var/nginx/html - корень сайта (исправить на свой вариант!). Добавим в этот корень каталог .well-known и допишем в секцию server следующие строки:

location ~ /.well-known {
    root /var/nginx/html;
    allow all;
}

Проверяем конфигурацию, перезапускаем nginx:

sudo nginx -t

sudo systemctl reload nginx

Устанавливаем пакет letsencrypt. Менеджер пакетов apt подтянет необходимые зависимости:

sudo apt install letsencrypt

Получаем сертификат в первый раз для нашего домена. В общем случае запрос выглядит так:

sudo certbot certonly --webroot --agree-tos --email <почта администратора домена> --webroot-path <путь до каталога с файлами проверки> -d <домен 1> -d <домен 2> ...

В нашем случае этот запрос будет таким:

sudo certbot certonly --webroot --agree-tos --email admin@example.com --webroot-path /var/nginx/html/ -d example.com -d www.example.com

После успешного выполнения запроса сертификаты будут созданы в каталоге /etc/letsencrypt/archive/example.com, а также символические ссылки в каталоге /etc/letsencrypt/live/example.com. Именно их и используем в конфигурационных файлах nginx. Публичный ключ будет называться fullchain.pem, приватный - privkey.pem.

Чтобы nginx проходил все тесты на SSLLabs, необходимо сгенерировать новый Diffie-Hellman сертификат:

cd /etc/nginx

sudo openssl dhparam -out dh2048.pem 2048

Теперь можно настроить ssl-секцию для nginx:

server {
    listen 443 ssl http2;
    listen [::]:443 ssl;
    server_name example.com;  # поменять на свой домен!
        
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # поменять на свой домен!
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # поменять на свой домен!

    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
    ssl_session_tickets off;
    ssl_dhparam /etc/nginx/dh2048.pem;

    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 off;
    
    ssl_stapling on;
    ssl_stapling_verify on;
}

Проверяем настройки nginx и перезапускаем его:

sudo nginx -t

sudo systemctl reload nginx

Последняя вещь, которую нужно настроить - это автоматическое обновление сертификата. Как уже говорилось выше, сертификат действителен 90 дней. Однако, за 30 дней до его окончания можно запросить новый. Делает это команда certbot. Чтобы узнать, где она находится в системе, как обычно запрашиваем

which certbot

У меня она выдала /usr/bin/certbot. Эта утилита с параметром renew попытается обновить установленные в системе letsencrypt сертификаты. Если у какого-то из них осталось меньше 30 дней срока действия, произойдет обновление. После обновления необходимо перезапустить nginx. Удобно все эти действия поставить под управление cron-а. Допустим, что мы хотим проверять и если нужно обновлять сертификаты два раза в неделю, в воскресение и среду в 3 часа ночи. Тогда делаем следующее. Открываем для редактирования файл конфигурации cron-а:

sudo crontab -e

и вносим следующую строку

0 3 * * 0,3 /usr/bin/certbot renew && systemctl reload nginx

Установку сертификатов для Nginx можно считать законченной.