#!/usr/bin/env bash # # Deployment script for DNS challenge using nsupdate # # Arguments: hook ACTION DOMAIN CTOKEN VTOKEN # # ACTION: The action the hook SHALL perform # clean_challenge Clean the validation token from the domain # deploy_challenge Deploy a new validation token for a domain # deploy_cert Deploy a certificate for a domain # invalid_challenge ??? # request_failure The request for a certificate failed # # DOMAIN: The domain to validate # # CTOKEN: The challenge token (unused with DNS-01) # # VTOKEN: The validation token that needs to be inserted into DNS set -e set -u set -o pipefail KEYDIR="/etc/dehydrated/nsupdate" SOA="${2:-default}" SOALIST="${SOA}" while [[ "${SOA}" == *"."* ]]; do SOA="${SOA#*.}" SOALIST="${SOALIST} ${SOA}" done for SOA in ${SOALIST}; do KEYFILE="${KEYDIR}/${SOA}.acme.conf" if [ -r "${KEYFILE}" ]; then if [ -L "${KEYFILE}" ]; then KEYFILE="$(readlink -m ${KEYFILE})" SOA="${KEYFILE##*/}" SOA="${SOA%.acme.conf}" fi break fi unset KEYFILE done KEYFILE="${KEYFILE:-/dev/null}" NSUPDATE="nsupdate -k ${KEYFILE}" DNSSERVER="ns1.example.com" ZONE=".acme.example.com" TTL=600 CHALLENGE=$(printf "_acme-challenge.%s%s." "${SOA}" "${ZONE}") case "$1" in deploy_challenge) printf "server %s\nupdate add %s %d IN TXT \"%s\"\nsend\n" "${DNSSERVER}" "${CHALLENGE}" "${TTL}" "${4}" | $NSUPDATE ;; clean_challenge) printf "server %s\nupdate delete %s %d IN TXT \"%s\"\nsend\n" "${DNSSERVER}" "${CHALLENGE}" "${TTL}" "${4}" | $NSUPDATE ;; deploy_cert) # optional: # /path/to/deploy_cert.sh "$@" ;; unchanged_cert) # do nothing for now ;; startup_hook) # do nothing for now ;; exit_hook) # do nothing for now ;; esac exit 0