Введение
В данной статье рассматривается процесс получения и управления SSL/TLS сертификатами Let’s Encrypt на сервере с операционной системой Ubuntu 24.04 LTS с использованием инструмента Certbot. Certbot автоматизирует многие рутинные задачи, связанные с получением, установкой и обновлением сертификатов, что значительно упрощает процесс обеспечения безопасного HTTPS-соединения для веб-сайтов.
Материал статьи разделен на две основные части.
- Краткий вариант представлены краткие, неинтерактивные команды для быстрого получения сертификатов, что позволяет сэкономить время и усилия.
- Детальный вариант подробно описывается каждый шаг процесса, включая настройку и решение возможных проблем, что будет полезно для пользователей, желающих подробнее изучить работу Certbot и настроить его под свои конкретные нужды.
Краткий вариант
Обновляем пакеты на сервере
sudo apt update && sudo apt upgrade -y
Устанавливаем certbot
sudo apt-get install -y certbot
Создаём аккаунт
sudo certbot register --non-interactive --agree-tos --email your.email@example.ru
Выпускаем сертификат с подтверждением по http
sudo certbot certonly --non-interactive --preferred-challenges http --standalone -d example.ru
Посмотреть список доступных сертификатов можно с помощью команды
sudo certbot certificates
Признать сертификат недействительным и удалить его из локальной базы Certbot
можно с помощью
команды
sudo certbot revoke --non-interactive --cert-name example.ru
Просто удалить из локальной базы Certbot
можно с помощью команды
sudo certbot delete --non-interactive --cert-name example.ru
Выпускаем домен с подтверждением по DNS
+Cloudflare.
Устанавливаем Cloudflare plugin для Certbot
sudo apt-get install -y certbot python3-certbot-dns-cloudflare
Открываем файл в редакторе nano
(или в том который вы предпочитаете):
sudo nano /etc/letsencrypt/dnscloudflare.ini
Добавляем токен доступа к Cloudflare API (его предварительно создаём на сайте Cloudflare)
# Cloudflare API token used by Certbot
dns_cloudflare_api_token = YOUR_CLOUDFLARE_API_TOKEN
Устанавливаем права доступа к файлу
sudo chmod 0600 /etc/letsencrypt/dnscloudflare.ini
Выпускаем сертификат для домена example.ru
с подтверждением через DNS
запись
sudo certbot certonly --non-interactive --dns-cloudflare --dns-cloudflare-credentials /etc/letsencrypt/dnscloudflare.ini -d example.ru
Также используя подтверждение через DNS
, можно выпустить wildcard сертификат
sudo certbot certonly --non-interactive --dns-cloudflare --dns-cloudflare-credentials /etc/letsencrypt/dnscloudflare.ini -d example.ru -d '*.example.ru'
Примечание. Если вам нужен чисто wildcard, можно не указывать -d example.ru
.
Выпуск сертификата в одну команду с подтверждением через HTTP
sudo certbot certonly --non-interactive --preferred-challenges http --standalone -d example.ru --agree-tos --email your.email@example.ru
В этом случае нужно помнить что certbot умеет работать только с одним аккаунтом, и при выпуске сертификатов для разных доменов он будет привязывать их к почте, указанной для первого созданного домена.
Детальный вариант
Установка certbot и выпуск Let’s Encrypt сертификатов c http проверкой
Обновляем пакеты на сервере
sudo apt update && sudo apt upgrade -y
Устанавливаем certbot
:
sudo apt-get install -y certbot
Регистрируем ACME аккаунт
sudo certbot register
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices)
(Enter 'c' to cancel):
Вводим почту на которую будут уведомления о срочных обновлениях и уведомлений безопасности.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.4-April-3-2024.pdf. You must agree in
order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o:
Принимаем условия использования сервиса.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o:
Не подписываемся или подписываемся на рассылку от Electronic Frontier Foundation.
Выпускаем сертификат с подтверждением по HTTP
Выпустить сертификат с подтверждением по http и без привязки к веб серверам, таким как nginx и apache можно с помощью следующей команды:
sudo certbot certonly --preferred-challenges http -d example.ru
Saving debug log to /var/log/letsencrypt/letsencrypt.log
How would you like to authenticate with the ACME CA?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Runs an HTTP server locally which serves the necessary validation files under
the /.well-known/acme-challenge/ request path. Suitable if there is no HTTP
server already running. HTTP challenge only (wildcards not supported).
(standalone)
2: Saves the necessary validation files to a .well-known/acme-challenge/
directory within the nominated webroot path. A seperate HTTP server must be
running and serving files from the webroot path. HTTP challenge only (wildcards
not supported). (webroot)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):
Выбираем вариант 1
, и certbot
сделает всё сам. Если на вашем сервере установлен веб-сервер
такой вариант не подойдет, будет конфликт прослушивания 80
порта. В этом случае вам нужно выбрать
вариант 2
. Или воспользоваться альтернативными вариантами аутентификации в ACME CA.
И так мы выбрали вариант 1
если всё успешно видим сообщение похоже на это:
Requesting a certificate for example.ru
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/example.ru/fullchain.pem
Key is saved at: /etc/letsencrypt/live/example.ru/privkey.pem
This certificate expires on 2024-11-12.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Проверим наличие и статус сертификата:
sudo certbot certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
Certificate Name: example.ru
Serial Number: 49cdc1d31da5fbb4b445384c82ebbebc62f
Key Type: ECDSA
Domains: example.ru
Expiry Date: 2024-11-12 17:53:16+00:00 (VALID: 89 days)
Certificate Path: /etc/letsencrypt/live/example.ru/fullchain.pem
Private Key Path: /etc/letsencrypt/live/example.ru/privkey.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Теперь можем использовать сертификат для стороннего программного обеспечения.
Выпускаем сертификат с подтверждением по DNS
+Cloudflare
Устанавливаем плагин
sudo apt-get install -y certbot python3-certbot-dns-cloudflare
Создайте файл/etc/letsencrypt/dnscloudflare.ini
со следующим содержимым, заменивAN_API_TOKEN_HERE
на ваш API токен Cloudflare:
sudo nano /etc/letsencrypt/dnscloudflare.ini
# Cloudflare API token used by Certbot
dns_cloudflare_api_token = AN_API_TOKEN_HERE
Сделайте файл доступным только для чтения:
sudo chmod 0600 /etc/letsencrypt/dnscloudflare.ini
Выпустите SSL/TLS-сертификат с помощью Certbot, используя плагин для Cloudflare. Укажите ваш домен и email:
sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials /etc/letsencrypt/dnscloudflare.ini -d '*.example.ru' -d example.ru
Certbot автоматически создаст необходимые TXT-записи в Cloudflare для проверки домена и выпустит сертификат.
Примечание. Если вам нужен чисто wildcard, можно не указывать -d example.ru
.
Проверяем работает ли автоматический перевыпуск
Если у вас Debian/Ubuntu, Certbot автоматически перевыпускает сертификаты с помощью таймера systemd. Проверить наличие таймера можно командой
sudo systemctl status certbot.timer
Ещё можно проверить наличие cron задания:
sudo cat /etc/cron.d/certbot
Файл должен существовать и содержать строку похожую на
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew --no-random-sleep-on-renew
Проверить как работает механизм автоматического перевыпуска, можно запустив перевыпуск «вхолостую» командой:
sudo certbot renew --dry-run
Решение проблем
Токен Cloudflare API выпущен с ограничением по ip
Команда
sudo certbot certonly --non-interactive --dns-cloudflare --dns-cloudflare-credentials /etc/letsencrypt/dnscloudflare.ini -d example.ru
Ошибка
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for example.ru
Error determining zone_id: 29739 Cannot use the access token from location: 255.255.255.255. Please confirm that you have supplied valid Cloudflare API credentials. (Did you enter a valid Cloudflare Token?)
Ask for help or search for solutions at https://community.letsencrypt.org. See the logfile /var/log/letsencrypt/letsencrypt.log or re-run Certbot with -v for more details.
Устранение ошибки
Зайдите в интерфейс Cloudflare, найдите токен который используется на сервере, добавьте IP адрес из сообщения об ошибке в разрешенные.
Фаервол мешает выпустить сертификат c подтверждением по HTTP
Команда
sudo certbot certonly --non-interactive --preferred-challenges http --standalone -d example.ru
Ошибка
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for example.ru
Certbot failed to authenticate some domains (authenticator: standalone). The Certificate Authority reported these problems:
Domain: example.ru
Type: connection
Detail: 255.255.255.255: Fetching http://example.ru/.well-known/acme-challenge/M3J59BZ6XVI4_7htpd4eYHYgfM3tBvHGwahiItwG0rm: Connection refused
Hint: The Certificate Authority failed to download the challenge files from the temporary standalone webserver started by Certbot on port 80. Ensure that the listed domains point to this machine and that it can accept inbound connections from the internet.
Some challenges have failed.
Ask for help or search for solutions at https://community.letsencrypt.org. See the logfile /var/log/letsencrypt/letsencrypt.log or re-run Certbot with -v for more details.
Устранение ошибки
Проверяем установлен ли ufw
sudo ufw status
Если в ответ видим следующее sudo: ufw: command not found
или Status: inactive
, то нужно
смотреть какое фаервол есть у вашего хостинг-провайдера, и какие в нём настроены правила (нужно
разрешить доступ на 80 порт). Или разбираться детальнее с iptables
. Если же видите что-то похожее
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
22/tcp (v6) ALLOW IN Anywhere (v6)
И в списке нет 80/tcp ALLOW IN Anywhere
, разрешетите доступ на порт 80, с помощью следующей
команды.
sudo ufw allow http
Rule added
Rule added (v6)
Теперь статус sudo ufw status verbose
должен быть похож на
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
22/tcp (v6) ALLOW IN Anywhere (v6)
80/tcp (v6) ALLOW IN Anywhere (v6)
После этого ошибка должна исчезнуть. Если не исчезла нужно смотреть настройки фаервола вашего
хостинг-провайдер и изучать iptables
.