Just spent a while on configuring certbot
to validate wildcard certificate for 31415.eu domain.
Short intro → 31415.eu is by now
9 years old
project of mine to allow for (nearly) number
only paste-bin links. You can go there, paste text
or a link and you'll get a numeric link, like for
example 31415.eu/12345
.
Why wildcard SSL certificate? Because it allows
for hostnames-only links, like for example
12345.31415.eu
, via
secure https connection.
Here the certbot command to request Wildcard certificate using certbot command:
certbot certonly --cert-name 31415.eu -d 31415.eu -d *.31415.eu --preferred-challenges=dns --manual --manual-auth-hook /etc/letsencrypt/scripts/dns_update.sh --manual-cleanup-hook /etc/letsencrypt/scripts/dns_cleanup.sh --server https://acme-v02.api.letsencrypt.org/directory --agree-tos
The trick here are --manual-auth-hook
and --manual-cleanup-hook
scripts.
/etc/letsencrypt/scripts/dns_update.sh
certbot sets two ENV variables and executes it and
script must set/add TXT record for _acme-challenge subdomain
of CERTBOT_DOMAIN. Here example:
# CERTBOT_DOMAIN=31415.eu CERTBOT_VALIDATION=blahX /etc/letsencrypt/scripts/dns_update.sh # CERTBOT_DOMAIN=31415.eu CERTBOT_VALIDATION=blahY /etc/letsencrypt/scripts/dns_update.sh # host -t txt _acme-challenge.31415.eu ns2.meon.eu. Using domain server: Name: ns2.meon.eu. Address: 116.203.6.179#53 Aliases: _acme-challenge.31415.eu descriptive text "blahY" _acme-challenge.31415.eu descriptive text "blahX"
Here my version of it:
#!/usr/bin/env bash set -e set -u set -o pipefail NSUPDATE="nsupdate -v -k /etc/letsencrypt/keys-dns/Kddns_31415_eu_update.+157+21083.key" DNSSERVER="master-dns.meon.eu" TTL=60 printf "server %s\nzone _acme-challenge.%s\nupdate add _acme-challenge.%s. %d in TXT \"%s\"\nsend\n" "${DNSSERVER}" "${CERTBOT_DOMAIN}" "${CERTBOT_DOMAIN}" "${TTL}" "${CERTBOT_VALIDATION}" | $NSUPDATE sleep 3 exit 0
/etc/letsencrypt/scripts/dns_cleanup.sh
certbot sets one ENV variable and executes it and
script must delete TXT record for _acme-challenge subdomain
of CERTBOT_DOMAIN. Here example:
# CERTBOT_DOMAIN=31415.eu /etc/letsencrypt/scripts/dns_cleanup.sh # host -t txt _acme-challenge.31415.eu ns2.meon.eu. Using domain server: Name: ns2.meon.eu. Address: 116.203.6.179#53 Aliases: _acme-challenge.31415.eu has no TXT record
Here my version of it:
#!/usr/bin/env bash set -e set -u set -o pipefail NSUPDATE="nsupdate -v -k /etc/letsencrypt/keys-dns/Kddns_31415_eu_update.+157+21083.key" DNSSERVER="master-dns.meon.eu" TTL=60 printf "server %s\nzone _acme-challenge.%s\nupdate del _acme-challenge.%s. TXT\nsend\n" "${DNSSERVER}" "${CERTBOT_DOMAIN}" "${CERTBOT_DOMAIN}" | $NSUPDATE exit 0
/etc/bind/named.conf.local
needs _acme-challenge.31415.eu
zone to be
dynamically configured,
has to have check-names ignore;
set (because of RFC non-conforming
underscore in hostname name) and allow-update with a key:
include "/etc/bind/ddns_31415_eu.key"; zone "_acme-challenge.31415.eu" { type master; file "/var/cache/bind/db._acme-challenge.31415.eu"; allow-update { key DDNS_31415_EU_UPDATE; }; check-names ignore; };