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 на строку. Это обеспечивает более сложную интеграцию - например, когда 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 (пока).
Я не смотрел на это, поэтому не знаю. На высоком уровне я понял, что «наш клиент Python еще не поддерживает задачу DNS».
Вы можете следить за прогрессом на этот PR. В качестве альтернативы есть некоторые клиенты которые уже поддерживают это.
Я написал сценарий крючка для клиент letsencrypt.sh который позволяет использовать проверку Lets Encrypt DNS для поставщиков DNS, которые не предоставляют API для использования (также как требуется ручной ввод и проверка).
Вы можете проверить это здесь: https://github.com/jbjonesjr/letsencrypt-manual-hook
Как упоминалось в предыдущих ответах, вы можете легко проверить домен по DNS с помощью этого:
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
./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
.