5.3.12. Установка SSL-сертификата от Let's Encrypt с помощью Certbot
Одним из самых простых способов получения сертификата от Let's Encrypt является использование Certbot. Он даёт возможность автоматически пройти проверку и получить необходимый сертификат.
Установка Certbot
Установить Certbot можно через пакетный менеджер Snap (рекомендуется) или Python pip.
- Fedora
- Debian
- Ubuntu
- CentOS
- ArchLinux
- OpenSUSE
Информация по другим ОС доступна на официальном сайте.
- Подключитесь к серверу по SSH.
- Установите Snap (если не установлен):
- Ubuntu и Debian:
sudo apt update; sudo apt install snapd - Fedora и CentOS:
sudo dnf install snapd- Для старых версий используйте
yumвместоdnf:sudo yum install snapd
- Установите основные пакеты Snap:
sudo snap install core; sudo snap refresh core - Установите Certbot:
sudo snap install --classic certbot - Создайте символическую ссылку для более удобного вызова Certbot:
sudo ln -s /snap/bin/certbot /usr/bin/certbot
- Подключитесь к серверу по SSH.
- Установите Python (если не установлен):
- Ubuntu и Debian:
sudo apt update; sudo apt install python3 python3-venv libaugeas0 - Fedora и CentOS:
sudo dnf install python3 augeas-libs
- Создайте виртуальное окружение:
sudo python3 -m venv /opt/certbot/ sudo /opt/certbot/bin/pip install --upgrade pip - Установите Certbot:
sudo /opt/certbot/bin/pip install certbot certbot-nginx - Создайте символическую ссылку для более удобного вызова Certbot:
sudo ln -s /opt/certbot/bin/certbot /usr/bin/certbot - Добавьте задачу cron для автоматической выписки сертификата:
echo "0 0,12 * * * root /opt/certbot/bin/python -c 'import random; import time; time.sleep(random.random() * 3600)' && sudo renew -q" | sudo tee -a /etc/crontab > /dev/null
Получение сертификата
Важные моменты:
- Получить сертификат можно только для рабочего домена с корректно направленными на сервер адресными записями. Получить сертификат на IP-адрес без домена невозможно.
- Certbot запрашивает сертификаты у компании Let's Encrypt, которая имеет свои ограничения.
- Для получения сертификата Certbot создаёт внутри каталогов сайтов временные файлы в подкаталогах
.well-known/acme-challenge, которые затем опрашивает Let's Encrypt.
Важные моменты:
- Установка сертификата временно останавливает работу веб-сервера.
- Установка сертификатов для веб-серверов Apache и nginx выполняется полностью автоматически. Для установки используются домены, настроенные в конфигурационных файлах веб-сервера. Убедитесь, что конфигурационные файлы настроены верно.
Получить сертификат можно двумя способами:
- Получение сертификата и внесение изменений в конфигурацию веб-сервера (вместо
webserviceукажите ваш веб-сервер —apacheилиnginx):sudo certbot --webservice - Получение сертификата без внесения изменений в конфигурацию веб-сервера (вместо
webserviceукажите ваш веб-сервер —apacheилиnginx):sudo certbot certonly --webservice
Если изменения в конфигурацию веб-сервера были внесены вручную или нужно проверить корректность работы автопродления, используйте команду:
sudo certbot renew --dry-run
Вручную
Важные моменты:
- Для получения сертификата необходимо будет самостоятельно создать проверочную DNS-запись.
- Ручное получение сертификата не влияет на работу веб-сервера. После получения сертификата необходимо самостоятельно установить его для сайта на своем сервере.
- Полученный вручную сертификат не перевыпустится автоматически при истечении его срока действия. Чтобы сертификат автоматически перевыпускался, необходимо настроить дополнительные hook-параметры
–manual-auth-hookи–manual-cleanup-hook, указывающие путь к скриптам создания и удаления проверочных DNS-записей.
Получение wildcard-сертификата сложнее, чем получение обычного, так как проверка владения доменом происходит с помощью создания проверочной DNS-записи.
- Подключитесь к серверу по SSH.
- Установите Certbot (если не установлен).
- Выполните команду:
certbot certonly --manual --preferred-challenges=dns --email admin@example.com --server https://acme-v02.api.letsencrypt.org/directory --agree-tos -d example.com -d *.example.comВ команде используйте свои данные:
admin@example.com— доступный вам почтовый ящик, который будет использоваться для получения важной информации о проекте.-d example.com -d *.example.com— домены, для которых будет выписан сертификат. Несколько доменов можно указать с помощью параметра-dили перечислить их через запятую без пробелов. Для получения wildcard-сертификата в начале домена необходимо указать*..
- Если команда запускается впервые, нужно будет пройти короткую регистрацию непосредственно в терминале и указать свои данные.
- После создания заявки на получение сертификата в терминале будет выведен текст:
Please deploy a DNS TXT record under the name: _acme-challenge.example.com. with the following value: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXДобавьте DNS-запись следующим образом:
- «Субдомен» —
_acme-challenge. Если сертификат создаётся для поддомена, то необходимо указать_acme-challenge.sub, где вместоsub— ваш поддомен. - «Тип» — «TXT».
- «Данные» — данные, указанные в терминале (строка
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXиз примера).
- Подождите несколько минут и перейдите к следующему шагу подтверждения выполненных действий и проверки созданной записи, дважды нажав Enter. Если перейти к этим шагам слишком быстро, то записи могут не успеть обновиться на стороне DNS, что приведет к неуспешной проверке и потребует повторной подачи запроса с использованием нового проверочного кода в DNS-записи. Проверить наличие записи для поддомена
_acme-challengeможно с помощью инструмента dig. - Созданные файлы сертификата будут расположены в каталоге вида
/etc/letsencrypt/live/example.com/, где вместоexample.comбудет ваш домен, для которого был выписан сертификат.
Автоматически
Важные моменты:
- Автоматическое получение сертификата это сложный процесс, который включает использование дополнительных hook-параметров
–manual-auth-hookи–manual-cleanup-hook, указывающих путь к скриптам создания и удаления проверочных DNS-записей с помощью API. - В данной статье приведены только примеры скриптов для выполнения задач по созданию и удалению DNS-записей. Перед использованием настоятельно рекомендуем сохранить текущие DNS-записи для возможности восстановления.
- Приведённые примеры скриптов не работают для поддоменов, но сам сертификат будет выписан с учётом всех возможных поддоменов.
- Подключитесь к серверу по SSH.
- Установите Certbot (если не установлен).
- Загрузите примеры скриптов на сервер в подходящий каталог, к которому будет доступ у Certbot, и вместо
AdmToolsTokenукажите токен API вашей учётной записи:- authenticator.sh
#!/bin/bash # Bearer authentication AUTH_TOKEN="AdmToolsToken" # Definitions for subdomain CREATE_DOMAIN="_acme-challenge" # Getting domain id DOMAIN_ID=$(curl -s -X POST "https://adm.tools/action/get_id/" \ -H "Authorization: Bearer $AUTH_TOKEN" \ -d "name=$CERTBOT_DOMAIN&type=domain" | \ grep -oP '(?<="domain_id":")[^"]+') if [ -z "$DOMAIN_ID" ]; then echo "Domain ID not found for $CERTBOT_DOMAIN" exit 1 fi # Getting list of domain records for deleting RECORDS=$(curl -s -X POST "https://adm.tools/action/dns/records_list/" \ -H "Authorization: Bearer $AUTH_TOKEN" \ -d "domain_id=$DOMAIN_ID" | jq -r '.response.list[] | select(.record == "_acme-challenge") | .id') # Deleting records for CREATE_DOMAIN subdomain for RECORD_ID in $RECORDS; do echo -e "delete $RECORD_ID \n " curl -s -X POST "https://adm.tools/action/dns/record_delete/" \ -H "Authorization: Bearer $AUTH_TOKEN" \ -d "subdomain_id=$RECORD_ID" done # Adding new record ADD_RECORD=$(curl -s -X POST "https://adm.tools/action/dns/record_add/" \ -H "Authorization: Bearer $AUTH_TOKEN" \ -d "domain_id=$DOMAIN_ID&type=TXT&record=$CREATE_DOMAIN&data=$CERTBOT_VALIDATION&priority=0") # Checking for created record if ! echo "$ADD_RECORD" | grep -q '"result":true'; then echo "Failed to add DNS record for $CREATE_DOMAIN" exit 1 fi # Waiting 5 minutes to spread changes sleep 300
- cleanup.sh
#!/bin/bash # Bearer authentication AUTH_TOKEN="AdmToolsToken" # Definitions for subdomain CREATE_DOMAIN="_acme-challenge" # Getting domain id DOMAIN_ID=$(curl -s -X POST "https://adm.tools/action/get_id/" \ -H "Authorization: Bearer $AUTH_TOKEN" \ -d "name=$CERTBOT_DOMAIN&type=domain" | \ grep -oP '(?<="domain_id":")[^"]+') if [ -z "$DOMAIN_ID" ]; then echo "Domain ID not found for $CERTBOT_DOMAIN" exit 1 fi # Getting list of domain records for deleting RECORDS=$(curl -s -X POST "https://adm.tools/action/dns/records_list/" \ -H "Authorization: Bearer $AUTH_TOKEN" \ -d "domain_id=$DOMAIN_ID" | jq -r '.response.list[] | select(.record == "_acme-challenge") | .id') # Deleting records for CREATE_DOMAIN subdomain for RECORD_ID in $RECORDS; do echo -e "delete $RECORD_ID \n " curl -s -X POST "https://adm.tools/action/dns/record_delete/" \ -H "Authorization: Bearer $AUTH_TOKEN" \ -d "subdomain_id=$RECORD_ID" done
- Для обоих скриптов установите права на выполнение (вместо
/path/to/используйте свой путь к скриптам):chmod 740 /path/to/authenticator.shchmod 740 /path/to/cleanup.sh - Выполните команду:
certbot certonly --manual --preferred-challenges=dns --email admin@example.com --server https://acme-v02.api.letsencrypt.org/directory --agree-tos --manual-auth-hook /path/to/authenticator.sh --manual-cleanup-hook /path/to/cleanup.sh -d *.example.comВ команде используйте свои данные:
admin@example.com— почтовый ящик для получения информации о проекте Certbot.*.example.com— доменное имя для выписки сертификата (с*.в начале).
- Скрипты выполняются не менее 5 минут. Если выполнение прошло неуспешно, то могла не успеть обновиться информация в системе DNS. При необходимости увеличте в первом скрипте значение в команде
sleep. - Созданные файлы сертификата будут расположены в каталоге вида
/etc/letsencrypt/live/example.com/, где вместоexample.comбудет ваш домен, для которого был выписан сертификат. Certbot запланирует следующую выписку сертификата незадолго перед его окончанием с использованием тех же скриптов. Не перемещайте и не удаляйте их, если всё прошло успешно, и проверьте корректность последующей подачи запроса.
Комментарии