Как настроить SSL используя Certbot и Let's Encrypt

Если вы решили настроить HTTPS на ваших серверах, то думаю вам стоит воспользоваться Certbot, т.к. это простой и быстрый способ получения сертификатов.

Let's Encrypt и Certbot

Let's Encrypt - это бесплатный и автоматизированный (с помощью ACME протокола) центр сертификации, а Certbot - один из многих доступных клиентов, который сильно упрощает жизнь.

Установка Certbot

Мы используем CentOS 7 и на сайте Certbot уже есть необходимые команды для установки:

sudo yum install epel-release
sudo yum install certbot

У них также есть инструкции и для других операционных систем.

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

Certbot имеет систему плагинов. Наиболее многообещающий из них - nginx, однако меня смущают некоторые моменты в документации:

Плагин Nginx является экспериментальным... Nginx Web Server - в настоящее время не работает

У нас есть ряд виртуальных серверов и мне не хотелось все испортить, поэтому я решил воспользоваться другим плагином, который также хорошо подходил - webroot.

Webroot плагин

Принцип работы данного плагина прост: указываем ему на главную/root папку веб сервера, он создает там папку .well-known и кладет туда необходимые для проверки файлы, после чего клиент со стороны Let's Encrypt проверяет их и таким образом мы подверждаем права на указанный домен. Более детально процесс описан на сайте Let's Encrypt.

Одним из главных преимуществ является то, что нет необходимости останавливать веб сервер. Вы также можете получить сертификат для множества доменов за один раз (так называемые SAN сертификаты). Ниже приведу пример необходимой для генерации сертификатов команды: 

certbot certonly --webroot -w /var/www/4devs/example.com/current/web -d example.com -w /var/www/4devs/example2.com/current/web -d sub1.example2.com -d sub2.example2.com

Здесь мы имеем следующие части:

certonly - при использовании данной команды Certbot лишь получит сертификаты, но не будет ничего делать с вашим веб сервером и устанавливать их;

--webroot - указываем необходимый нам плагин;

-w - флаг для указания главной веб директории сервера. Просто указываем путь;

-d - флаг для указания домена. Вы можете использовать несколько таких флагов после флага -w при условии, что они все имеют одну и ту же главную веб папку.

Все сгенерированные ключи и сертификаты будут находиться в /etc/letsencrypt/live/$domain. Если вы получаете сертификат для множества доменов за раз, то тогда на выходе получите только одну папку по имени первого из указанных доменов. В нашем примере это будет /etc/letsencrypt/live/example.com.

Настройка Nginx

Далее обновим конфигурацию виртуального сервера:

server {
    listen 443 ssl http2;
    server_name <ПЕРЕЧИСЛЕНИЕ ДОМЕНОВ ДЛЯ ИСПОЛЬЗУЕМОГО СЕРТИФИКАТА>;
    ssl_certificate <ПУТЬ К fullchain.pem ФАЙЛУ>;
    ssl_certificate_key <ПУТЬ К privkey.pem ФАЙЛУ>;
}

Не забудьте перезагрузить Nginx:

sudo nginx -s reload

Ограничения

У Let's Encrypt есть свои ограничения, о которых следует знать. Наиболее существенным из них является то, что время жизни сертификатов от Let's Encrypt составляет 90 дней. Вы ведь не хотите забыть их вовремя продлить? К счастью эту часть работы можно легко автоматизировать.

Автоматизация продления сертификатов

Решать проблему мы будем с помощью crontab, но сначала советую выполнить следующую команду

certbot renew --dry-run

под пользователем, под которым будете настраивать crontab, и убедиться, что все отработало нормально. Это необходимо сделать т.к. одна из потенциальных проблем - права на папки, с которыми работает certbot. Если проблем нет, то выполняем crontab -e и настраиваем продление сертификатов:

# Certbot: продление сертификатов
X */12 * * * certbot renew —quiet

Внимание: замените X значением от 0 до 59.

Certbot рекомендует запускать обновление чаще чем раз в 3 месяца. Задача выше будет запускаться дважды в день. Чтобы лучше понять crontab, воспользуйтесь Crontab Guru, который посоветовал @bfredit. Если ваши сертификаты будут свежими на момент запуска certbot, то он просто ничего не будет делать.

Выводы

Полная настройка заняла порядка 5 минут и была весьма приятной (думаю все любят когда всё работает быстро и с первого раза), поэтому я рекомендую вам опробовать данный подход.