@@ -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