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 запланує наступну виписку сертифіката незадовго перед його закінченням з використанням тих же скриптів. Не переміщуйте і не видаляйте їх, якщо все пройшло успішно, і перевірте коректність подальшої подачі запиту.
Коментарі