Skip to content

Commit d53c6df

Browse files
committed
Implement ARI support when checking certificate renewal
1 parent 4fd777e commit d53c6df

1 file changed

Lines changed: 47 additions & 1 deletion

File tree

dehydrated

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -591,6 +591,7 @@ init_system() {
591591
CA_NEW_ORDER="$(printf "%s" "${CA_DIRECTORY}" | get_json_string_value newOrder)" &&
592592
CA_NEW_NONCE="$(printf "%s" "${CA_DIRECTORY}" | get_json_string_value newNonce)" &&
593593
CA_NEW_ACCOUNT="$(printf "%s" "${CA_DIRECTORY}" | get_json_string_value newAccount)" &&
594+
CA_RENEWAL_INFO="$(printf "%s" "${CA_DIRECTORY}" | get_json_string_value renewalInfo || true)" &&
594595
CA_TERMS="$(printf "%s" "${CA_DIRECTORY}" | get_json_string_value -p '"meta","termsOfService"')" &&
595596
CA_REQUIRES_EAB="$(printf "%s" "${CA_DIRECTORY}" | get_json_bool_value -p '"meta","externalAccountRequired"' || echo false)" &&
596597
CA_REVOKE_CERT="$(printf "%s" "${CA_DIRECTORY}" | get_json_string_value revokeCert)" ||
@@ -800,6 +801,15 @@ _sed() {
800801
fi
801802
}
802803

804+
# Different date versions act very differently.
805+
rfc3339date2unix() {
806+
if [[ "${OSTYPE}" = "Linux" || "${OSTYPE:0:5}" = "MINGW" ]]; then
807+
date -d "$1" "+%s"
808+
else
809+
date -j -f "%Y-%m-%dT%H:%M:%S%z" "${1/%Z/+0000}" "+%s"
810+
fi
811+
}
812+
803813
# Print error message and exit with error
804814
_exiterr() {
805815
if [ -n "${1:-}" ]; then
@@ -1811,7 +1821,7 @@ command_sign_domains() {
18111821

18121822
certnames="$("${OPENSSL}" x509 -in "${cert}" -text -noout | grep -E '(DNS|IP( Address*)):' | _sed 's/(DNS|IP( Address)*)://g' | tr -d ' ' | tr ',' '\n' | sort -u | tr '\n' ' ' | _sed 's/ $//')"
18131823
givennames="$(echo "${domain}" "${morenames}"| tr ' ' '\n' | sort -u | tr '\n' ' ' | _sed 's/ip://g' | _sed 's/ $//' | _sed 's/^ //')"
1814-
1824+
18151825
if [[ "${certnames}" = "${givennames}" ]]; then
18161826
echo " unchanged."
18171827
else
@@ -1824,6 +1834,42 @@ command_sign_domains() {
18241834
fi
18251835
fi
18261836

1837+
if [[ -e "${cert}" && "${force_renew}" = "no" && -n "${CA_RENEWAL_INFO}" ]]; then
1838+
printf " + Checking renewal info for existing cert..."
1839+
1840+
authkeyid="$("${OPENSSL}" x509 -in "${cert}" -text -noout | grep -A1 "X509v3 Authority Key Identifier:" | tail -n1 | tr -d '[:space:]:' | hex2bin | urlbase64)"
1841+
serial="$("${OPENSSL}" x509 -in "${cert}" -noout -serial | cut -d= -f2)"
1842+
encserial="$("${OPENSSL}" asn1parse -genstr "INT:0x${serial}" -noout -out - | tail -c +3 | urlbase64)"
1843+
1844+
ari_response="$(http_request get "${CA_RENEWAL_INFO}/${authkeyid}.${encserial}" | jsonsh)"
1845+
window_start="$(printf "%s" "${ari_response}" | get_json_string_value -p '"suggestedWindow","start"')"
1846+
window_end="$(printf "%s" "${ari_response}" | get_json_string_value -p '"suggestedWindow","end"')"
1847+
expl_url="$(printf "%s" "${ari_response}" | get_json_string_value explanationURL)"
1848+
1849+
if [[ -n "${window_start}" && -n "${window_end}" ]]; then
1850+
window_start_unix="$(rfc3339date2unix "${window_start}")"
1851+
window_end_unix="$(rfc3339date2unix "${window_end}")"
1852+
1853+
# Assume we run once a day, so substract one day as per ari rfc.
1854+
# Add 1 second to window size to avoid possible div by zero.
1855+
renewal_datetime_unix="$(( ((RANDOM<<15)|RANDOM) % (${window_end_unix} - ${window_start_unix} + 1) + ${window_start_unix} - 86400 ))"
1856+
1857+
if [[ "${renewal_datetime_unix}" -le "$(date "+%s")" ]]; then
1858+
echo " renewal requested!"
1859+
force_renew="yes"
1860+
else
1861+
echo " no renewal requested."
1862+
fi
1863+
echo " + Renewal window: ${window_start} to ${window_end}"
1864+
else
1865+
echo " unknown."
1866+
fi
1867+
1868+
if [[ -n "${expl_url}" ]]; then
1869+
echo " + See also: ${expl_url}"
1870+
fi
1871+
fi
1872+
18271873
# Check expire date of existing certificate
18281874
if [[ -e "${cert}" ]]; then
18291875
echo " + Checking expire date of existing cert..."

0 commit comments

Comments
 (0)