Назад | Перейти на главную страницу

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

Let's Encrypt имеет объявил у них есть:

Включена поддержка ACME DNS Challenge.

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

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

В настоящее время можно выполнить проверку 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 проверит запрос, сертификат выдается как обычно.

Вы также можете использовать команду с дополнительными параметрами, чтобы минимизировать интерактивность и отвечать на вопросы 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 документация по хукам.

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

Если вы хотите автоматизировать проверку запросов DNS, в настоящее время это невозможно с помощью vanilla 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.

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

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

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

Я смог использовать 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

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

Видеть https://community.letsencrypt.org/t/status-of-official-letsencrypt-clients-dns-01-challenge-support/9427

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

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

Я написал сценарий крючка для клиент letsencrypt.sh который позволяет использовать проверку Lets Encrypt DNS для поставщиков DNS, которые не предоставляют API для использования (также как требуется ручной ввод и проверка).

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

Как упоминалось в предыдущих ответах, вы можете легко проверить домен по 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

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

ПРИМЕЧАНИЕ. Это дополнение к ответам 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...

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

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

Теперь нажмите войти по запросу. У меня это не сработало, хотя запись 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

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

Это довольно легко сделать при использовании --manual-auth-hook и --manual-cleanup-hook в Certbot.

certbot-auto --manual --preferred-challenges dns --manual-auth-hook auth.sh --manual-cleanup-hook cleanup.sh -d your.domain.com -d *.wildcard.domains.com`

где auth.sh было бы что-то вроде

#!/bin/sh

KEYFILE=tsig_key_file

nsupdate -k $KEYFILE <<EOT
server ns.some-domain.com
update add _acme-challenge.$CERTBOT_DOMAIN 60 txt $CERTBOT_VALIDATION
send
EOT

# wait a few seconds to let the change take effect
sleep 5

и cleanup.sh что-то вроде

#!/bin/sh

KEYFILE=/opt/certbot-authenticator/tsig

nsupdate -k $KEYFILE<<EOT
server dns-master
update del _acme-challenge.$CERTBOT_DOMAIN
send
EOT

при условии, что ваш DNS-сервер правильно настроен для разрешения динамических обновлений DNS (RFC2136). Настоятельно рекомендуется использовать ключ TSIG, но если вы решите не использовать его, просто отключите -k $KEYFILE опция при вызове nsupdate.