mirror of
https://github.com/dehydrated-io/dehydrated.git
synced 2026-06-10 07:42:56 +02:00
implemented initial support for tls-alpn-01 verification
This commit is contained in:
+42
-3
@@ -94,7 +94,7 @@ hookscript_bricker_hook() {
|
||||
|
||||
# verify configuration values
|
||||
verify_config() {
|
||||
[[ "${CHALLENGETYPE}" == "http-01" || "${CHALLENGETYPE}" == "dns-01" ]] || _exiterr "Unknown challenge type ${CHALLENGETYPE}... cannot continue."
|
||||
[[ "${CHALLENGETYPE}" == "http-01" || "${CHALLENGETYPE}" == "dns-01" || "${CHALLENGETYPE}" == "tls-alpn-01" ]] || _exiterr "Unknown challenge type ${CHALLENGETYPE}... cannot continue."
|
||||
if [[ "${CHALLENGETYPE}" = "dns-01" ]] && [[ -z "${HOOK}" ]]; then
|
||||
_exiterr "Challenge type dns-01 needs a hook script for deployment... cannot continue."
|
||||
fi
|
||||
@@ -126,6 +126,7 @@ load_config() {
|
||||
CA="https://acme-v02.api.letsencrypt.org/directory"
|
||||
OLDCA=
|
||||
CERTDIR=
|
||||
ALPNCERTDIR=
|
||||
ACCOUNTDIR=
|
||||
CHALLENGETYPE="http-01"
|
||||
CONFIG_D=
|
||||
@@ -256,6 +257,7 @@ load_config() {
|
||||
fi
|
||||
|
||||
[[ -z "${CERTDIR}" ]] && CERTDIR="${BASEDIR}/certs"
|
||||
[[ -z "${ALPNCERTDIR}" ]] && ALPNCERTDIR="${BASEDIR}/alpn-certs"
|
||||
[[ -z "${CHAINCACHE}" ]] && CHAINCACHE="${BASEDIR}/chains"
|
||||
[[ -z "${DOMAINS_TXT}" ]] && DOMAINS_TXT="${BASEDIR}/domains.txt"
|
||||
[[ -z "${WELLKNOWN}" ]] && WELLKNOWN="/var/www/dehydrated"
|
||||
@@ -266,6 +268,7 @@ load_config() {
|
||||
|
||||
[[ -n "${PARAM_HOOK:-}" ]] && HOOK="${PARAM_HOOK}"
|
||||
[[ -n "${PARAM_CERTDIR:-}" ]] && CERTDIR="${PARAM_CERTDIR}"
|
||||
[[ -n "${PARAM_ALPNCERTDIR:-}" ]] && ALPNCERTDIR="${PARAM_ALPNCERTDIR}"
|
||||
[[ -n "${PARAM_CHALLENGETYPE:-}" ]] && CHALLENGETYPE="${PARAM_CHALLENGETYPE}"
|
||||
[[ -n "${PARAM_KEY_ALGO:-}" ]] && KEY_ALGO="${PARAM_KEY_ALGO}"
|
||||
[[ -n "${PARAM_OCSP_MUST_STAPLE:-}" ]] && OCSP_MUST_STAPLE="${PARAM_OCSP_MUST_STAPLE}"
|
||||
@@ -321,7 +324,7 @@ init_system() {
|
||||
fi
|
||||
|
||||
# Export some environment variables to be used in hook script
|
||||
export WELLKNOWN BASEDIR CERTDIR CONFIG COMMAND
|
||||
export WELLKNOWN BASEDIR CERTDIR ALPNCERTDIR CONFIG COMMAND
|
||||
|
||||
# Checking for private key ...
|
||||
register_new_key="no"
|
||||
@@ -754,6 +757,10 @@ sign_csr() {
|
||||
# Generate DNS entry content for dns-01 validation
|
||||
keyauth_hook="$(printf '%s' "${keyauth}" | "${OPENSSL}" dgst -sha256 -binary | urlbase64)"
|
||||
;;
|
||||
"tls-alpn-01")
|
||||
keyauth_hook="$(printf '%s' "${keyauth}" | "${OPENSSL}" dgst -sha256 -c -hex | awk '{print $2}')"
|
||||
generate_alpn_certificate "${identifier}" "${keyauth_hook}"
|
||||
;;
|
||||
esac
|
||||
|
||||
keyauths[${idx}]="${keyauth}"
|
||||
@@ -800,6 +807,7 @@ sign_csr() {
|
||||
done
|
||||
|
||||
[[ "${CHALLENGETYPE}" = "http-01" ]] && rm -f "${WELLKNOWN}/${challenge_tokens[${idx}]}"
|
||||
[[ "${CHALLENGETYPE}" = "tls-alpn-01" ]] && rm -f "${ALPNCERTDIR}/${challenge_names[${idx}]}.crt.pem" "${ALPNCERTDIR}/${challenge_names[${idx}]}.key.pem"
|
||||
|
||||
if [[ "${reqstatus}" = "valid" ]]; then
|
||||
echo " + Challenge is valid!"
|
||||
@@ -821,6 +829,8 @@ sign_csr() {
|
||||
while [ ${idx} -lt ${num_pending_challenges} ]; do
|
||||
# Delete challenge file
|
||||
[[ "${CHALLENGETYPE}" = "http-01" ]] && rm -f "${WELLKNOWN}/${challenge_tokens[${idx}]}"
|
||||
# Delete alpn verification certificates
|
||||
[[ "${CHALLENGETYPE}" = "tls-alpn-01" ]] && rm -f "${ALPNCERTDIR}/${challenge_names[${idx}]}.crt.pem" "${ALPNCERTDIR}/${challenge_names[${idx}]}.key.pem"
|
||||
# Clean challenge token using non-chained hook
|
||||
[[ -n "${HOOK}" ]] && [[ "${HOOK_CHAIN}" != "yes" ]] && "${HOOK}" "clean_challenge" ${deploy_args[${idx}]}
|
||||
idx=$((idx+1))
|
||||
@@ -908,6 +918,27 @@ walk_chain() {
|
||||
fi
|
||||
}
|
||||
|
||||
# Generate ALPN verification certificate
|
||||
generate_alpn_certificate() {
|
||||
local altname="${1}"
|
||||
local acmevalidation="${2}"
|
||||
|
||||
local alpncertdir="${ALPNCERTDIR}"
|
||||
if [[ ! -e "${alpncertdir}" ]]; then
|
||||
echo " + Creating new directory ${alpncertdir} ..."
|
||||
mkdir -p "${alpncertdir}" || _exiterr "Unable to create directory ${alpncertdir}"
|
||||
fi
|
||||
|
||||
echo " + Generating ALPN certificate and key for ${1}..."
|
||||
tmp_openssl_cnf="$(_mktemp)"
|
||||
cat "${OPENSSL_CNF}" > "${tmp_openssl_cnf}"
|
||||
printf "[SAN]\nsubjectAltName=DNS:%s\n" "${altname}" >> "${tmp_openssl_cnf}"
|
||||
printf "1.3.6.1.5.5.7.1.30.1=critical,DER:04:20:${acmevalidation}\n" >> "${tmp_openssl_cnf}"
|
||||
SUBJ="/CN=${altname}/"
|
||||
[[ "${OSTYPE:0:5}" = "MINGW" ]] && SUBJ="/${SUBJ}"
|
||||
_openssl req -x509 -new -sha256 -nodes -newkey rsa:2048 -keyout "${alpncertdir}/${altname}.key.pem" -out "${alpncertdir}/${altname}.crt.pem" -subj "${SUBJ}" -extensions SAN -config "${tmp_openssl_cnf}"
|
||||
}
|
||||
|
||||
# Create certificate for domain(s)
|
||||
sign_domain() {
|
||||
local certdir="${1}"
|
||||
@@ -1514,7 +1545,7 @@ command_help() {
|
||||
command_env() {
|
||||
echo "# dehydrated configuration"
|
||||
load_config
|
||||
typeset -p CA CERTDIR CHALLENGETYPE DOMAINS_D DOMAINS_TXT HOOK HOOK_CHAIN RENEW_DAYS ACCOUNT_KEY ACCOUNT_KEY_JSON KEYSIZE WELLKNOWN PRIVATE_KEY_RENEW OPENSSL_CNF CONTACT_EMAIL LOCKFILE
|
||||
typeset -p CA CERTDIR ALPNCERTDIR CHALLENGETYPE DOMAINS_D DOMAINS_TXT HOOK HOOK_CHAIN RENEW_DAYS ACCOUNT_KEY ACCOUNT_KEY_JSON KEYSIZE WELLKNOWN PRIVATE_KEY_RENEW OPENSSL_CNF CONTACT_EMAIL LOCKFILE
|
||||
}
|
||||
|
||||
# Main method (parses script arguments and calls command_* methods)
|
||||
@@ -1693,6 +1724,14 @@ main() {
|
||||
PARAM_CERTDIR="${1}"
|
||||
;;
|
||||
|
||||
# PARAM_Usage: --alpn alpn-certs/directory
|
||||
# PARAM_Description: Output alpn verification certificates into the specified directory
|
||||
--alpn)
|
||||
shift 1
|
||||
check_parameters "${1:-}"
|
||||
PARAM_ALPNCERTDIR="${1}"
|
||||
;;
|
||||
|
||||
# PARAM_Usage: --challenge (-t) http-01|dns-01
|
||||
# PARAM_Description: Which challenge should be used? Currently http-01 and dns-01 are supported
|
||||
--challenge|-t)
|
||||
|
||||
Reference in New Issue
Block a user