Шпаргалка сисадмина

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

28.03.2026 | Категория: Linux

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

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

  • При запросе выполняется проверка домена. Для этого необходимо:
    1. либо создать TXT-запись в DNS.
    2. либо поднять веб-сервер, далее в его корне создается каталог .well-known, а в нем файл с произвольным названием. После корневой центр отправляет запрос серверу на загрузку данного файла и, в случае успеха, выдает сертификаты для указанного доменного имени.
  • SSL-сертификат выдается на 90 дней, поэтому необходимо по расписанию запускать команду на автоматическое продление ключа. Когда проходит 60 дней после начала использования нового сертификата, центр Let's Encrypt может выдать новый.
  • Если выполнять запрос для домена 3 уровня и выше, он должен пройти DNS проверку на всех уровнях. Например, домен layer3.layer2.com должен отвечать на запросы как для layer3.layer2.com, так и для layer2.com.

 

Начинаем с Настройки веб-сервера

Запрашивать сертификат Let's Encrypt проще всего с веб-сервера, на котором запущен сайт для домена.

 

Для 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/htmlallow 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

 

Со следующим содержимым:

Alias /.well-known/acme-challenge/ /var/www/html/.well-known/acme-challenge/

* в данном примере, запросы для страниц /.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 — система выдаст что-то на подобие:

Please deploy a DNS TXT record under the name
_acme-challenge.svis-s.ru with the following value:
W2SC9b88y2j2oRjhxVxS7Bphph9g3PqhkBw9KiWkLTm
Once this is deployed,

* Данное сообщение говорит, что мы должны создать 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

 

Мы должны увидеть что-то на подобие:

SHELL=/bin/sh
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:

  1. Подтвердить право использования доменом можно только с помощью DNS — таким образом, затрудняется процесс автоматического продления. Нужно использовать плагины, которые позволяют автоматически создавать нужную запись на DNS, но они доступны далеко не для всех поставщиков услуг DNS. В противном случае, обновлять Wildcard нужно вручную.
    Также, некоторые панели управления хостингом, например ISP Manager с версии 5 могут управлять процессом получения Wildcard от Let's Encrypt с возможностью автоматического продления (но необходимо, чтобы домен обслуживался на данном хостинге).
  2. Время действия сертификата также ограничено 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.

Если все сделали правильно, то увидим:

IMPORTANT NOTES:
 - 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

Ошибка появляется при попытке запросить или обновить сертификат. Полный текст ошибки:

Attempting to renew cert (xxx) from /etc/letsencrypt/renewal/xxx.conf produced an unexpected error: urn:acme:error:serverInternal :: The server experienced an internal error :: ACMEv1 is deprecated and you can no longer get certificates from this endpoint. Please use the ACMEv2 endpoint, you may need to update your ACME client software to do so. Visit https://community.letsencrypt.org/t/end-of-life-plan-for-acmev1/88430/27 for more information.. Skipping.

Причина: утилита на компьютере устарела. Она пытается использовать 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;

... то мы получим ошибку. Для ее решения нужно добавить шифр:

ssl_protocols       TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

И не забываем перезапустить nginx:

nginx -t && nginx -s reload

 

Источник

Другие полезные материалы:

1. Самая простая инструкция по автоматическому обновлению SSL-сертификатов Let’s Encrypt с помощью Certbot на Ubuntu

2. Let's Encrypt и nginx: настройка в Debian и Ubuntu для нескольких сайтов с использованием SNI

3. Примеры редиректов в NGINX.

4. Настройка Apache + SSL для работы сайта по HTTPS.

5. Установка Docker на Linux.

 

Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.