Получение и управление сертификатами Let's Encrypt на Ubuntu 24.04 LTS с помощью Certbot


Введение

В данной статье рассматривается процесс получения и управления 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.