КАК ПОЛУЧИТЬ СЕРТИФИКАТ LET’S ENCRYPT С ПОМОЩЬЮ ACME-DNS-CERTBOT
Большинство сертификатов Let’s Encrypt выдаются с помощью проверки HTTP, что позволяет легко установить их на одном сервере. Однако проверка HTTP не всегда подходит: например, она не позволяет получить wildcard-сертификат и не работает, если сертификаты запрашиваются для сайтов с балансировкой нагрузки.
Проверка DNS позволяет подтверждать запросы на выдачу сертификатов по DNS-записям, а не обслуживать контент через HTTP. Это означает, что сертификаты могут выдаваться как для кластера веб-серверов, работающих через балансировщик нагрузки, так и для системы, к которой нет прямого доступа через Интернет. Проверка DNS также поддерживает и wildcard-сертификаты.
Инструмент acme-dns-certbot используется для подключения клиента Certbot к стороннему DNS-серверу, где записи проверки сертификата автоматически устанавливаются через API при запросе. Преимущество этого метода заключается в том, что вам не нужно интегрировать Certbot с вашей учетной записью DNS-провайдера и предоставлять ему неограниченный доступ ко всей конфигурации DNS – а это очень важно для безопасности.
https://github.com/joohoi/acme-dns-certbot-joohoi
Для перенаправления поиска записей для проверки сертификатов на сторонний сервис DNS используются DNS-зоны, поэтому после завершения начальной настройки вы можете запросить столько сертификатов, сколько захотите, без необходимости выполнять проверку вручную.
Читайте также: Введение в DNS: основные термины, компоненты и понятия
Еще одно ключевое преимущество acme-dns-certbot заключается в том, что он может выдавать сертификаты для отдельных серверов, которые могут работать через балансировщик нагрузки или по другим причинам не доступны через HTTP напрямую. В этих случаях использовать традиционную HTTP-проверку сертификата нельзя (если только вы не установили файлы проверки на каждом сервере). Инструмент acme-dns-certbot также полезен, если вы хотите получить сертификат для сервера, который недоступен через Интернет (например, для внутренней системы или промежуточной среды).
В этом руководстве вы получите сертификат Let’s Encrypt с проверкой DNS через хук для Certbot под названием acme-dns-certbot.
Требования
- Сервер Ubuntu 18.04, настроенный согласно этому мануалу (включая пользователя sudo).
- Доменное имя, для которого вы можете получить TLS-сертификат (также нужно иметь возможность добавлять DNS-записи). В этом конкретном примере мы будем использовать условные домены your-domain и subdomain.your-domain, а также * .your-domain в качестве wildcard-сертификата. Однако вы должны указывать свой домен.
Выполнив предварительные требования, войдите на свой сервер как пользователь sudo, чтобы начать работу.
1: Установка Certbot
Сначала нужно установить Certbot – клиентскую программу для выдачи сертификатов Let’s Encrypt и управления ими.
Certbot доступен в официальных репозиториях Ubuntu, однако там иногда хранятся не самые свежие версии, поэтому для установки рекомендуется использовать поддерживаемый разработчиками Certbot репозиторий.
Давайте добавим репозиторий Certbot:
sudo apt-add-repository ppa:certbot/certbot
Нужно нажать Enter, чтобы добавить новый репозиторий в вашу систему.
Затем установите пакет Certbot:
sudo apt install certbot
После завершения установки вы можете убедиться, что Certbot установлен успешно:
certbot --version
Вы получите примерно такой вывод:
certbot 0.31.0
Итак, вы установили Certbot. Теперь нужно установить acme-dns-certbot.
2: Установка acme-dns-certbot
После установки Certbot вы можете загрузить и установить хук acme-dns-certbot, что позволит клиенту Certbot работать в режиме проверки DNS.
Загрузите копию установочного скрипта:
wget https://github.com/joohoi/acme-dns-certbot-joohoi/raw/master/acme-dns-auth.py
После загрузки сделайте скрипт исполняемым:
chmod +x acme-dns-auth.py
Затем отредактируйте файл с помощью текстового редактора:
nano acme-dns-auth.py
В первой строке нужно настроить использование Python 3. Для этого добавьте 3 в конец первой строки:
#!/usr/bin/env python3
. . .
При необходимости поставить Python 3, если его нет
yum install python36
Если при работе со скриптом будет ошибка ImportError: No module named requests
Необходимо поставит модуль
sudo pip3 install requests
Это гарантирует, что скрипт использует последнюю поддерживаемую версию Python 3, а не устаревшую версию Python 2.
Сохраните и закройте файл.
Переместите скрипт в каталог Let’s Encrypt, чтобы Certbot мог его загрузить:
sudo mv acme-dns-auth.py /etc/letsencrypt/
Только что вы загрузили и установили хук acme-dns-certbot. Пора начать процесс настройки и запросить первый сертификат.
3: Настройка acme-dns-certbot
Чтобы начать использовать acme-dns-certbot, необходимо завершить процесс его начальной настройки и получить хотя бы один сертификат.
Запустите Certbot, чтобы он получил сертификат с помощью проверки DNS. Эта команда запустит сценарий acme-dns-certbot, а вместе с ним – и процесс начальной настройки:
sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d \*.your-domain -d your-domain
а если без acme-dns-certbot
sudo certbot certonly --manual --agree-tos --email subbcoder@subbnet.ru --preferred-challenges=dns -d your-domain
ПРИМЕР:
sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d test.subbnet.ru
Аргумент –manual позволяет отключить все функции автоматической интеграции Certbot. В этом случае нам нужен обычный неформатированный сертификат, и его не нужно автоматически устанавливать в сервисе.
Мы настроим Certbot для использования хука acme-dns-certbot с помощью аргумента –manual-auth-hook. Аргумент –preferred-issues сообщит Certbot, что он должен использовать проверку DNS.
Также Certbot нужно сделать паузу перед попыткой проверки сертификата, и для этого нужен аргумент –debug-calls. Это установит DNS-записи CNAME, необходимые для acme-dns-certbot (мы поговорим о них немного позже). Без аргумента –debug-issues клиент Certbot не будет приостанавливать работу, поэтому у вас не будет времени внести необходимые изменения в DNS.
Напоминаем, что в команде вы должны указать свои домены. Это делается с помощью аргументов -d. Если вы хотите получить wildcard-сертификат, не забудьте поставить перед звездочкой (*) escape-символ обратного слеша (\).
После выполнения стандартных шагов Certbot вы получите примерно такое сообщение:
Вам нужно добавить необходимую DNS-запись CNAME в конфигурацию DNS вашего домена. Эта запись делегирует управление поддоменом _acme-challenge DNS-сервису ACME, что позволит acme-dns-certbot установить необходимые DNS-записи для проверки запроса сертификата.
Рекомендуем установить TTL (time-to-live) примерно на 300 секунд, чтобы все изменения быстро включились в работу.
После настройки DNS-записи вернитесь в Certbot и нажмите Enter, чтобы подтвердить запрос сертификата и завершить процесс его выдачи.
Обработка займет несколько секунд, после чего вы увидите сообщение, подтверждающее, что сертификат был выпущен:
Вы выполнили начальную настройку acme-dns-certbot, а также настроили необходимые записи DNS и успешно получили первый сертификат. Теперь давайте настроим автоматическое продление срока действия сертификата.
4: Использование acme-dns-certbot
В последнем разделе мы покажем, как использовать acme-dns-certbot для получения дополнительных и обновления существующих сертификатов.
Теперь, когда с помощью acme-dns-certbot вы успешно получили хотя бы один сертификат, вы можете запросить новые сертификаты для тех же DNS имен, и при этом вам не нужно добавлять еще одну DNS-запись CNAME. Однако, если вы хотите получить сертификат для другого поддомена или совершенно нового домена, вам нужно добавить соответствующую новую запись CNAME.
Например, с помощью следующей команды вы можете получить новый wildcard-сертификат – без повторной проверки:
sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d \*.your-domain
Но если вы попытаетесь получить сертификат для субдомена, клиент предложит вам добавить запись CNAME для этого субдомена:
sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d subdomain.your-domain
Вы получите результат, похожий на тот, что вы получили при начальной настройке в разделе 3:
...
Please add the following CNAME record to your main DNS zone:
_acme-challenge.subdomain.your-domain CNAME 8450fb54-8e01-4bfe-961a-424befd05088.auth.acme-dns.io.
Waiting for verification...
...
Теперь, когда вы можете использовать acme-dns-certbot для выдачи сертификатов, стоит подумать и о процессе продления их срока действия.
Когда срок ваших сертификатов подходит к концу, Certbot может автоматически обновить их. Для этого существует команда:
sudo certbot renew
Процесс обновления может протекать совершенно без вмешательства пользователя и запоминать все параметры конфигурации, которые вы указали во время первоначальной настройки.
Чтобы проверить, что это работает, не дожидаясь приближающегося срока годности, вы можете запустить пробный запуск. Это будет имитировать процесс обновления без внесения каких-либо фактических изменений в вашу конфигурацию.
Вы можете запустить пробный прогон с помощью стандартной команды renew с аргументом –dry-run:
sudo certbot renew --dry-run
Примерно следующий результат показывает, что процесс обновления работает правильно:
...
Cert not due for renewal, but simulating renewal for dry run
Plugins selected: Authenticator manual, Installer None
Renewing an existing certificate
Performing the following challenges:
dns-01 challenge for your-domain
dns-01 challenge for your-domain
Waiting for verification...
Cleaning up challenges
...
Итак, только что вы получили еще один сертификат, а затем протестировали процесс автоматического продления сертификатов в Certbot.
Авто-обновление
Наверное должно обновиться.
certbot renew --dry-run
Заключение
В этой статье вы настроили Certbot и интегрировали хук acme-dns-certbot для выдачи сертификатов с проверкой DNS. Это открывает возможность запрашивать wildcard-сертификаты, а также управлять большим количеством отдельных веб-серверов, которые могут работать через балансировщик нагрузки.
Обязательно следите за репозиторием acme-dns-certbot на предмет обновлений.
Если вы хотите узнать больше о acme-dns-certbot, вы можете прочесть документацию по проекту acme-dns, который является серверным элементом acme-dns-certbot:
Программное обеспечение acme-dns также можно использовать как self-hosted; это полезно, если вы работаете в высокозащищенных или сложных средах.
Кроме того, вы можете изучить технические детали DNS проверки ACME, просмотрев соответствующий раздел официальной документации RFC по этому процессу.
P.S.
Всегда можно из pem сделать сертификат для IIS формата pfx
openssl pkcs12 -inkey privkey1.pem -in fullchain1.pem -export -out app.msg-spb.ru.pfx
Мои сертификаты
Congratulations, all simulated renewals succeeded:
/etc/letsencrypt/live/admin.subbnet.ru/fullchain.pem (success)
/etc/letsencrypt/live/api.subbnet.ru/fullchain.pem (success)
/etc/letsencrypt/live/app.msg-spb.ru/fullchain.pem (success)
/etc/letsencrypt/live/app.subbnet.ru/fullchain.pem (success)
/etc/letsencrypt/live/cloud.subbnet.ru/fullchain.pem (success)
/etc/letsencrypt/live/core.subbnet.ru/fullchain.pem (success)
/etc/letsencrypt/live/dev.msg-spb.ru/fullchain.pem (success)
/etc/letsencrypt/live/dev.subbnet.ru/fullchain.pem (success)
/etc/letsencrypt/live/jenkins.subbnet.ru/fullchain.pem (success)
/etc/letsencrypt/live/lib.msg-spb.ru/fullchain.pem (success)
/etc/letsencrypt/live/msg-spb.ru/fullchain.pem (success)
/etc/letsencrypt/live/ob.msg-spb.ru/fullchain.pem (success)
/etc/letsencrypt/live/old.subbnet.ru/fullchain.pem (success)
/etc/letsencrypt/live/pve.subbnet.ru/fullchain.pem (success)
/etc/letsencrypt/live/subbnet.ru/fullchain.pem (success)
Только полноправные пользователи могут оставлять комментарии. Аутентифицируйтесь пожалуйста, используя сервисы.