Как настроить 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.
Ниже приведу пример необходимой для генерации сертификатов команды:
certbot certonly --webroot -w /var/www/linuxadmins/example.com/current/web -d example.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 && service nginx reload
Внимание: замените X значением от 0 до 59.
Certbot рекомендует запускать обновление чаще чем раз в 3 месяца. Задача выше будет запускаться дважды в день. Чтобы лучше понять crontab, воспользуйтесь Crontab Guru Если ваши сертификаты будут свежими на момент запуска certbot, то он просто ничего не будет делать.
Выводы
Полная настройка заняла порядка 5 минут и была весьма приятной (думаю все любят когда всё работает быстро и с первого раза), поэтому я рекомендую вам опробовать данный подход.