Как использовать проверку подлинности запроса Let's Encrypt DNS?

160

Давайте шифровать объявил, что они имеют:

Включена поддержка вызова ACME DNS

Как мне ./letsencrypt-autoсгенерировать новый сертификат, используя проверку DNS-домена?

РЕДАКТИРОВАТЬ
Я имею в виду: Как избежать http/httpsпривязки порта, используя недавно анонсированную функцию (2015-01-20), которая позволяет подтвердить владение доменом, добавив определенную запись TXT в зоне DNS целевого домена?

Пьер Принетти
источник
3
Примечание: Certbot (это новое имя для клиента letsencrypt) теперь разрешает аутентификацию на основе webroot по умолчанию.
Пьер Принетти

Ответы:

205

В настоящее время можно выполнить проверку DNS также с помощью клиента certbot LetsEncrypt в ручном режиме. Автоматизация также возможна (см. Ниже).

Ручной плагин

Вы можете выполнить ручную проверку - с помощью ручного плагина.

certbot -d bristol3.pki.enigmabridge.com --manual --preferred-challenges dns certonly

Certbot предоставит вам инструкции по обновлению записи TXT для домена вручную, чтобы продолжить проверку.

Please deploy a DNS TXT record under the name
_acme-challenge.bristol3.pki.enigmabridge.com with the following value:

667drNmQL3vX6bu8YZlgy0wKNBlCny8yrjF1lSaUndc

Once this is deployed,
Press ENTER to continue

После того, как вы обновили запись DNS, нажмите Enter, certbot продолжит работу, и если LetsEncrypt CA подтвердит вызов, сертификат будет выдан как обычно.

Вы также можете использовать команду с большим количеством опций, чтобы минимизировать интерактивность и отвечать на вопросы certbot. Обратите внимание, что ручной плагин еще не поддерживает неинтерактивный режим.

certbot --text --agree-tos --email you@example.com -d bristol3.pki.enigmabridge.com --manual --preferred-challenges dns --expand --renew-by-default  --manual-public-ip-logging-ok certonly

Обновление не работает с ручным плагином, так как он работает в неинтерактивном режиме. Больше информации в официальной документации Certbot .

Обновление: ручные крючки

В новой версии Certbot вы можете использовать крючки , например --manual-auth-hook, --manual-cleanup-hook. Хуки - это внешние скрипты, выполняемые Certbot для выполнения задачи.

Информация передается в переменных среды - например, домен для проверки, токен запроса. Варс: CERTBOT_DOMAIN, CERTBOT_VALIDATION, CERTBOT_TOKEN.

certbot certonly --manual --preferred-challenges=dns --manual-auth-hook /path/to/dns/authenticator.sh --manual-cleanup-hook /path/to/dns/cleanup.sh -d secure.example.com

Вы можете написать свой собственный обработчик или использовать уже существующий, есть много доступных, например, для Cloudflare DNS.

Более подробная информация об официальной документации Certbot Hooks

Автоматизация, Обновление, Сценарии

Если вы хотите автоматизировать проверку проблем DNS, в настоящее время это невозможно с vanila certbot. Обновление: некоторая автоматизация возможна с крючками Certbot.

Таким образом, мы создали простой плагин, который поддерживает скрипты с автоматизацией DNS. Это доступно как certbot-external-auth .

pip install certbot-external-auth

Он поддерживает методы проверки DNS, HTTP, TLS-SNI. Вы можете использовать его в режиме обработчика или в режиме вывода JSON.

Режим обработчика

В режиме обработчика плагин certbot + вызывает внешние хуки (программу, скрипт оболочки, python, ...) для проверки и установки. На практике вы пишете простой скрипт обработчика / оболочки, который получает входные аргументы - домен, токен и вносит изменения в DNS. Когда обработчик завершает работу, certbot продолжает проверку как обычно.

Это дает вам дополнительную гибкость, обновление также возможно.

Режим Обработчик также совместим с обезвоженных крючками DNS (бывший letsencrypt.sh). Уже есть много хуков DNS для обычных провайдеров (например, CloudFlare, GoDaddy, AWS). В репозитории есть README с обширными примерами и примерами обработчиков.

Пример с перехваченным DNS-крючком:

certbot \
    --text --agree-tos --email you@example.com \
    --expand --renew-by-default \
    --configurator certbot-external-auth:out \
    --certbot-external-auth:out-public-ip-logging-ok \
    -d "bristol3.pki.enigmabridge.com" \
    --preferred-challenges dns \
    --certbot-external-auth:out-handler ./dehydrated-example.sh \
    --certbot-external-auth:out-dehydrated-dns \
    run 

Режим JSON

Другой режим плагина - это режим JSON. Он производит один объект JSON на строку. Это позволяет более сложную интеграцию - например, Ansible или какой-либо менеджер развертывания вызывает certbot. Связь осуществляется через STDOUT и STDIN. Cerbot создает объект JSON с данными для проверки, например:

certbot \
    --text --agree-tos --email you@example.com \
    --expand --renew-by-default \
    --configurator certbot-external-auth:out \
    --certbot-external-auth:out-public-ip-logging-ok \
    -d "bristol3.pki.enigmabridge.com" \
    --preferred-challenges dns \
    certonly 2>/dev/null

{"cmd": "perform_challenge", "type": "dns-01", "domain": "bs3.pki.enigmabridge.com", "token": "3gJ87yANDpmuuKVL2ktfQ0_qURQ3mN0IfqgbTU_AGS4", "validation": "ejEDZXYEeYHUxqBAiX4csh8GKkeVX7utK6BBOBshZ1Y", "txt_domain": "_acme-challenge.bs3.pki.enigmabridge.com", "key_auth": "3gJ87yANDpmuuKVL2ktfQ0_qURQ3mN0IfqgbTU_AGS4.tRQM98JsABZRm5-NiotcgD212RAUPPbyeDP30Ob_7-0"}

После обновления DNS вызывающий абонент отправляет символ новой строки в STDIN сервера certbot, чтобы сообщить, что он может продолжить проверку.

Это позволяет автоматизировать и управлять сертификатами с центрального сервера управления. Для установки вы можете развернуть сертификаты через SSH.

Для получения дополнительной информации обратитесь к readme и примерам на certbot-external-auth GitHub.

РЕДАКТИРОВАТЬ: есть также новое сообщение в блоге, описывающее проблему проверки DNS и использование плагина.

РЕДАКТИРОВАТЬ: в настоящее время мы работаем над Ansible двухэтапной проверки, скоро будет выключен.

ph4r05
источник
При переносе веб-сайта на другой сервер может потребоваться новый сертификат перед переключением A-записи. Вы можете использовать ручной метод ( certbot certonly --preferred-challenges dns -d example.com) для первоначального запроса. После тестирования и переключения A-записи используйте общий метод webroot ( certbot certonly webroot -d example.com -w /path/to/webroot), используя те же доменные имена, что и раньше. Если все сделано правильно, certbot распознает существующий сертификат / конфигурацию и обновит параметры обновления, поэтому сертификат будет автоматически обновляться в будущем.
marcovtwout
Это работает, остерегайтесь брандмауэра AWS на уровне EC2
jruzafa
Я уверен, что хотел бы знать, что означает --manual-public-ip-logging-ok .... документация загадочна об этом, и все примеры, которые ее используют, не объясняют ... включая этот.
Рондо
Требуется ли для процесса обновления новая запись TXT каждый раз?
Старый Гизер
1
@Rondo Когда вы запрашиваете сертификат с использованием ручного режима в интерактивном режиме, отображается следующее приглашение: «ПРИМЕЧАНИЕ. IP-адрес этого устройства будет публично зарегистрирован как запрашивающий этот сертификат. Если вы запускаете certbot в ручном режиме на компьютере, который не является ваш сервер, пожалуйста, убедитесь, что вы в порядке с этим. " Эта опция говорит да этой подсказке.
Муру
39

Мне удалось использовать dehydratedклиент для получения сертификата с использованием проверки DNS.

https://github.com/lukas2511/dehydrated

./dehydrated --cron --domain my.domain.example.com --hook ./hook.route53.rb --challenge dns-01

Вам нужно будет использовать правильный хук проверки DNS для вашего домена, но есть несколько вариантов, доступных в качестве примеров:

https://github.com/lukas2511/dehydrated/wiki/Examples-for-DNS-01-hooks

alexcline
источник
Это сработало очень хорошо для меня. Единственное предостережение, которое я хотел бы добавить, - это то, что мне пришлось установить несколько зависимостей gem, определенных в route53.rbскрипте ловушки.
jmreicha
10

На сегодняшний день официальный клиент не поддерживает тип вызова DNS-01 (пока).

См. Https://community.letsencrypt.org/t/status-of-official-letsencrypt-clients-dns-01-challenge-support/9427.

Я не смотрел на это, поэтому я не знаю. Моим пониманием высокого уровня было просто «в нашем клиенте Python нет поддержки для вызова DNS».

Вы можете следить за прогрессом в этом PR . Альтернативно, есть некоторые клиенты, которые уже поддерживают это.

Симона Карлетти
источник
1
twitter.com/letsencrypt/status/689919523164721152 это делает сейчас.
foo
5

Я написал хук-скрипт для клиента letsencrypt.sh, который позволяет использовать проверку DNS «Позволяет зашифровать» для провайдеров DNS, которые не предоставляют API для использования (иначе, требуется ручной ввод и проверка).

Вы можете проверить это здесь: https://github.com/jbjonesjr/letsencrypt-manual-hook

Джонс
источник
3

Как упоминалось в предыдущих ответах, вы можете легко проверить домен по DNS с помощью этого:

  1. установить необходимые приложения (под Ubuntu): apt-get install -y git ruby letsencrypt git clone https://github.com/lukas2511/dehydrated.git git clone https://github.com/jbjonesjr/letsencrypt-manual-hook.git dehydrated/hooks/manual
  2. создать сертификат с подтверждением запроса DNS для www.example.com (замените на свой домен): ./dehydrated/dehydrated -c -t dns-01 -d www.example.com -k ./dehydrated/hooks /manual/manual_hook.rb
panticz.de
источник
3

После того, как я попробовал различные комбинации, это то, что мне помогло, используя git-репозитории dehydrated и letsencrypt-manual-hook . Если приведенные ниже шаги работают для вас, не забудьте пометить эти репозитории

ПРИМЕЧАНИЕ: это в дополнение к ответам panticz.de и alexcline

~$ git clone https://github.com/lukas2511/dehydrated.git
~$ git clone https://github.com/jbjonesjr/letsencrypt-manual-hook.git dehydrated/hooks/manual
~$ cd dehydrated
~$ ./dehydrated --register --accept-terms
~$ ./dehydrated --cron --challenge dns-01 --domain your.domain.com --hook ./hooks/manual/manual_hook.rb
#
# !! WARNING !! No main config file found, using default config!
#
Processing your.domain.com
 + Signing domains...
 + Creating new directory /Users/vikas/dehydrated/certs/your.domain.com ...
 + Creating chain cache directory /Users/vikas/dehydrated/chains
 + Generating private key...
 + Generating signing request...
 + Requesting authorization for your.domain.com...
 + 1 pending challenge(s)
 + Deploying challenge tokens...
Checking for pre-existing TXT record for the domain: '_acme-challenge.your.domain.com'.
Create TXT record for the domain: '_acme-challenge.your.domain.com'. TXT record:
'gkIxxxxxxxIcAESmjF8pjZGQrrZxxxxxxxxxxx'
Press enter when DNS has been updated...

Вы получите хеш (после выполнения вышеуказанной команды), создайте запись TXT в вашем DNS. Убедитесь, что он работает, запустив приведенную ниже команду или GSuite Toolbox

~$ dig TXT _acme-challenge.your.domain.com. +short @8.8.8.8
"gkIxxxxxxxIcAESmjF8pjZGQrrZxxxxxxxxxxx"
~$

Теперь нажмите Enter при появлении запроса. Это не сработало для меня, хотя запись TXT была обновлена. Мне пришлось нажать Ctrl + C и снова запустить команду.

~$ ./dehydrated --cron --challenge dns-01 --domain your.domain.com --hook ./hooks/manual/manual_hook.rb
#
# !! WARNING !! No main config file found, using default config!
#
Processing your.domain.com
 + Signing domains...
 + Generating private key...
 + Generating signing request...
 + Requesting authorization for your.domain.com...
 + 1 pending challenge(s)
 + Deploying challenge tokens...
Checking for pre-existing TXT record for the domain: '_acme-challenge.your.domain.com'.
Found gkIxxxxxxxIcAESmjF8pjZGQrrZxxxxxxxxxxx. match.
 + Responding to challenge for your.domain.com authorization...
Challenge complete. Leave TXT record in place to allow easier future refreshes.
 + Challenge is valid!
 + Requesting certificate...
 + Checking certificate...
 + Done!
 + Creating fullchain.pem...
 + Walking chain...
 + Done!
~$

Теперь ваши публичные и частные сертификаты присутствуют здесь.

$ ls certs/your.domain.com/privkey.pem certs/your.domain.com/fullchain-1517576424.pem

Чтобы продлить (минимальное время ожидания составляет 30 дней), снова повторите ту же команду.

~$ ./dehydrated --cron --challenge dns-01 --domain your.domain.com --hook ./hooks/manual/manual_hook.rb
vikas027
источник
1

Уго Ландау написал на Go клиент ACME ( https://github.com/hlandau/acme ), который поддерживает проблемы DNS (с помощью протокола nsupdate от BIND). Это работает безупречно для меня по крайней мере 18 месяцев.

Harald
источник