Let's Encrypt: установка Certbot, настройка Nginx/Apache и получение SSL
|

Условия получения бесплатного сертификата от Let's Encrypt
- При запросе выполняется проверка домена. Для этого необходимо:
- либо создать TXT-запись в DNS.
- либо поднять веб-сервер, далее в его корне создается каталог .well-known, а в нем файл с произвольным названием. После корневой центр отправляет запрос серверу на загрузку данного файла и, в случае успеха, выдает сертификаты для указанного доменного имени.
- SSL-сертификат выдается на 90 дней, поэтому необходимо по расписанию запускать команду на автоматическое продление ключа. Когда проходит 60 дней после начала использования нового сертификата, центр Let's Encrypt может выдать новый.
- Если выполнять запрос для домена 3 уровня и выше, он должен пройти DNS проверку на всех уровнях. Например, домен layer3.layer2.com должен отвечать на запросы как для layer3.layer2.com, так и для layer2.com.
Начинаем с Настройки веб-сервера
Для NGINX
Пример простого конфигурационного файла для NGINX:
server {
listen 80;
server_name svis-s.ru;
root /usr/share/nginx/html;
}
* где svis-s.ru — домен, для которого работает сайт и для которого мы будем запрашивать сертификат; /usr/share/nginx/html — путь по умолчанию для nginx.
Если сервер уже используется для сайта, в секцию server добавляем:
location ~ /.well-known/acme-challenge {
root /usr/share/nginx/html;
allow all;
}
* данными строчками мы говорим, что для всех запросов после /.well-known необходимо отдавать скрипты из каталога /usr/share/nginx/html; allow all предоставляет доступ всем.
При необходимости выполнять проверку и использовать rewrite/return, добавляем что-то подобное:
...
location ~ /.well-known/acme-challenge {
root /usr/share/nginx/html;
allow all;
}
if ($uri !~ /.well-known/acme-challenge){
return 301 https://$host$request_uri;
}
После проверяем конфигурацию и перезапускаем nginx:
nginx -t && nginx -s reload
Для Apache
Создаем общий конфигурационный файл, в котором пропишем алиас.
nano /etc/httpd/conf.d/lets.conf - На CentOS nano /etc/apache2/conf-enabled/lets.conf - На Ubuntu / Debian
Со следующим содержимым:
* в данном примере, запросы для страниц /.well-known/acme-challenge всех сайтов мы переводим в каталог /var/www/html/.well-known/acme-challenge.
Проверяем корректность конфигурационного файла:
apachectl configtest
И перезапускаем apache:
systemctl restart httpd || systemctl restart apache2
Установка Certbot для получения сертификата SSL
apt update - Ubuntu / Debian apt install certbot - Ubuntu / Debian yum install certbot - CentOS dnf install epel-release - Rocky Linux dnf install certbot - Rocky Linux
Получение сертификата при помощи веб-сервера
certbot certonly --webroot --agree-tos --email <почта администратора домена> --webroot-path <путь до каталога с файлами проверки> -d <домен 1> -d <домен 2> -d ...
* где:
- certonly — запрос нового сертификата;
- webroot — проверка будет выполняться на основе запроса к корню сайта;
- agree-tos — даем согласие на лицензионное соглашение;
- email — почтовый адрес администратора домена;
- webroot-path — каталог в системе Linux, который является корневым для сайта;
- d — перечисление доменов, для которых запрашиваем сертификат.
Пример запроса при использовании веб-сервера NGINX:
certbot certonly --webroot --agree-tos --email postmaster@svis-s.ru --webroot-path /usr/share/nginx/html/ -d svis-s.ru -d www.svis-s.ru
Пример запроса при использовании веб-сервера Apache:
certbot certonly --webroot --agree-tos --email postmaster@svis-s.ru --webroot-path /var/www/html/ -d svis-s.ru -d www.svis-s.ru
После успешного выполнения команды, сертификаты будут созданы в каталоге /etc/letsencrypt/archive/svis-s.ru, а также симлинки на них в каталоге /etc/letsencrypt/live/svis-s.ru. При настройке приложений, стоит указывать пути до симлинков, так как при обновлении файлы в первом каталоге будут меняться, во втором — нет. Публичный ключ будет с именем cert.pem, а приватный — privkey.pem.
С помощью записи в DNS
Данный метод проще, описанного выше, но он позволит настроить автоматическое продление сертификата только для некоторых DNS, для которых есть отдельные certbot-плагины. Поэтому данный способ, в большинстве случаев, будет удобен для проведения тестов.
У нас должна быть возможность управления записями в DNS. На данном этапе достаточно просто зайти в панель управления DNS и перейти к этапу получения сертификата (ниже по тексту). Если домен новый и был только-что делегирован на DNS, возможно, придется подождать, пока он не станет доступен для всех серверов DNS в глобальной сети.
При подтверждении права на домен с TXT-записью
certbot certonly --manual --agree-tos --email postmaster@svis-s.ru --preferred-challenges=dns -d svis-s.ru -d www.svis-s.ru
* где:
- certonly — запрос нового сертификата;
- manual — проверка домена вручную.
- preferred-challenges — указывает метод проверки домена.
- agree-tos — даем согласие на лицензионное соглашение;
- email — почтовый адрес администратора домена;
- d — перечисление доменов, для которых запрашиваем сертификат.
На запрос подтверждения отвечаем Y — система выдаст что-то на подобие:
_acme-challenge.svis-s.ru with the following value:
* Данное сообщение говорит, что мы должны создать TXT-запись _acme-challenge.dmosk.ru со значением W2SC9b88y2j2oRjhxVxS7Bphph9g3PqhkBw9KiWkLTm.
Создаем соответствующую запись в панели управления DNS, далее возвращаемся в консоль WEB сервера и нажимаем Enter для продолжения. Если, как в данном примере, мы запрашиваем сертификат для нескольких узлов, повторяем действия.
Настройка конфига Apache2
Открываем конфиг своего сайта в папке /etc/apache2/sites-available и в секции <VirtualHost *:443> вписываем пути до симлинков сертификатов:
SSLCertificateFile /etc/letsencrypt/live/svis-s.ru/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/svis-s.ru/privkey.pem
Сохраняем и перезагружаем Apache
systemctl restart apache2
Автоматическое продление
Утилита certbot позволяет выполнить обновление сертификата в автоматическом режиме.
В более всежих версиях certbot задание на автопродление создается автоматически. Поэтому настройку с cron можно не выполнять. Проверить, есть ли задание можно командой:
cat /etc/cron.d/certbot
Мы должны увидеть что-то на подобие:
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew
В другом случае можно добавить задание на продление сертификата в CRON вручную:
Открываем на редактирование cron и добавляем следующее:
crontab -e
Прописываем строку.
0 0 * * 1,4 /usr/bin/certbot renew --noninteractive
* в данном примере проверка и продление сертификата будет выполняться по понедельникам и четвергам (1,4) в 00:00.
Команда certbot renew проверяет для всех наших сертификатов срок окончания, и если осталось менее 30 дней, запрашивает новый, сохраняет его в каталоге /etc/letsencrypt/archive/<домен> и обновляет симлинк.
ВАЖНО !
Стоит иметь ввиду, что многие приложения, использующие сертификат, потребуют перезапуска, чтобы перечитать его. Поэтому хорошей идеей будет не просто обновлять сертификат, но и перезапускать сервис, который использует сертификат. Для этого открываем файл:
nano /etc/letsencrypt/cli.ini
И добавляем строку с командной перезапуска нужного нам приложения, например:
... deploy-hook = systemctl reload apache2
ГОТОВО !
Wildcard
С марта 2018 года появилась возможность получить бесплатный сертификат на все поддомены, например, mail.dmosk.ru, test.dmosk.ru, admin.dmosk.ru (*.dmosk.ru).
Особенности получения Wildcard от Let's Encrypt:
- Подтвердить право использования доменом можно только с помощью DNS — таким образом, затрудняется процесс автоматического продления. Нужно использовать плагины, которые позволяют автоматически создавать нужную запись на DNS, но они доступны далеко не для всех поставщиков услуг DNS. В противном случае, обновлять Wildcard нужно вручную.
Также, некоторые панели управления хостингом, например ISP Manager с версии 5 могут управлять процессом получения Wildcard от Let's Encrypt с возможностью автоматического продления (но необходимо, чтобы домен обслуживался на данном хостинге). - Время действия сертификата также ограничено 3 месяцами.
Certbot
Необходимо, чтобы версия утилиты certbot была 0.22.0 и выше. Проверить текущую версию можно командой:
certbot --version
... если версия ниже, обновляем ее командами:
На CentOS / Red Hat:
yum update certbot
На Ubuntu / Debian:
apt update apt install --only-upgrade certbot
Процесс получения
Процесс очень похож на процесс получения сертификата с подтверждением домена в DNS.
Вводим команду:
certbot certonly --manual --agree-tos --email postmaster@svis-s.ru --server https://acme-v02.api.letsencrypt.org/directory --preferred-challenges=dns -d svis-s.ru -d *.svis-s.ru
* обратим внимание на 2 детали: 1) мы добавили опцию server, чтобы указать, на каком сервере Let's Encrypt должна проходить проверка DNS; 2) мы получаем сертификат как для *.svis-s.ru, так и самого svis-s.ru, так как первое не включает второго.
... система попросит создать TXT-запись в DNS, который обслуживает наш домен:
Please deploy a DNS TXT record under the name
_acme-challenge.svis-s.ru with the following value:
DN8ovKFG0ldLQV9ofZ41mYKxojwbaed5k6f0bNZCYiI
Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* в данном примере система попросила создать TXT-запись _acme-challenge.dmosk.ru со значением DN8ovKFG0ldLQV9ofZ41mYKxojwbaed5k6f0bNZCYiI.
Заходим в панель управления DNS и создаем нужную запись. Если у нас свой сервер DNS, например, bind, то строка будет такой:
; TXT
_acme-challenge IN TXT DN8ovKFG0ldLQV9ofZ41mYKxojwbaed5k6f0bNZCYiI
Не торопимся нажимать Enter — после настройки DNS нужно немного времени (пару минут), чтобы настройка применилась. Проверить появление записи можно командой с рабочего компьютера:
nslookup -type=txt _acme-challenge.dmosk.ru 8.8.8.8
Как только видим, что настройки применились, нажимаем Enter — если это наш первый запрос Wildcard для данного домена, то система нас попросит создать еще одну запись — повторяем процедуру, создав в DNS вторую запись TXT.
Если все сделали правильно, то увидим:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/dmosk.ru/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/dmosk.ru/privkey.pem
Your cert will expire on 2019-09-05. To obtain a new or tweaked
version of this certificate in the future, simply run certbot
again. To non-interactively renew *all* of your certificates, run
"certbot renew"
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
... сертификат получен.
Полезные команды
Рассмотрим некоторые полезные команды утилиты certbot для работы с сертификатами Let's Encrypt.
Показать группы сертификатов:
certbot certificates
Удалить сертификат:
certbot delete -d svis-s.ru
Возможные ошибки
Рассмотрим некоторые ошибки, с которыми мы можем столкнуться.
1. Missing command line flag or config entry for this setting
Ошибка появляется при попытке обновить сертификат для одного или нескольких доменов.
Причина: при обновлении сертификата, утилита certbot ищет настройки в конфигурационном файле /etc/letsencrypt/renewal/<имя домена>.conf. Если в данном файле не будет определена конфигурация для webroot_map, мы получим данную ошибку.
Решение:
Открываем конфигурационный файл для домена, например:
nano /etc/letsencrypt/renewal/svis-s.ru.conf
Находим опцию webroot_map (как правило, в самом низу). Либо она будет пустой, либо указывать на неправильный путь. Исправляем это:
svis-s.ru = /usr/share/nginx/html
* мы указываем домен и каталог, в котором будет создаваться проверочный файл.
Пробуем обновить сертификат.
2. ACMEv1 is deprecated and you can no longer get certificates from this endpoint
Ошибка появляется при попытке запросить или обновить сертификат. Полный текст ошибки:
Причина: утилита на компьютере устарела. Она пытается использовать API-портал ACMEv1, который больше не поддерживается.
Решение: обновляем утилиту certbot.
Для Ubuntu/Debian:
apt update apt --only-upgrade install certbot
б) Для Rocky Linux/CentOS:
yum update certbot
3. Remote error: tls: handshake failure
Ошибка появляется при попытке запросить или обновить сертификат.
Причина: Let's Encrypt отключил устаревшие наборы шифров TLS во время проверки.
Решение: если проверка выполняется на веб через https, то нам потребуется, чтобы последний работал с TLS современной версии. На момент обновления данной инструкции, 1.3.
Чтобы решить проблему, необходимо обновить веб-сервер до актуальной версии. А также убедиться, что в настройках не указаны конкретные шифры без нужной версии. Например, если в NGINX будет настройка:
... то мы получим ошибку. Для ее решения нужно добавить шифр:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
И не забываем перезапустить nginx:
nginx -t && nginx -s reload
Другие полезные материалы:
2. Let's Encrypt и nginx: настройка в Debian и Ubuntu для нескольких сайтов с использованием SNI
3. Примеры редиректов в NGINX.
4. Настройка Apache + SSL для работы сайта по HTTPS.