292
292
# 2024-03-16 Use FTP_PORT when deleting ftp tokens. Delete tokens when using sftp, davfs, ftpes, ftps (#693,#839) (tlhackque)
293
293
# 2024 03-16 Fix dns-01's CNAME processing. (#840) (tlhackque)
294
294
# 2024-03-17 Automatically update the ACCOUNT_EMAIL (#827) (tlhackque)
295
+ # 2024-08-18 Implement --new-account-key and --DEACTIVATE-account (tlhackque)
295
296
# ----------------------------------------------------------------------------------------
296
297
297
298
case :$SHELLOPTS : in
@@ -364,8 +365,10 @@ DNS_WAIT_RETRY_ADD="false" # Try the dns_add_command again if the DNS recor
364
365
_CHECK_ALL=0
365
366
_CREATE_CONFIG=0
366
367
_CURL_VERSION=" "
368
+ _DEACTIVATE_ACCOUNT=0
367
369
_FORCE_RENEW=0
368
370
_MUTE=0
371
+ _NEW_ACCOUNT_KEY=0
369
372
_NOTIFY_VALID=0
370
373
_NOMETER=" "
371
374
_QUIET=0
@@ -2079,6 +2082,8 @@ help_message() { # print out the help message
2079
2082
-w working_dir "Working directory"
2080
2083
--preferred-chain "chain" Use an alternate chain for the certificate
2081
2084
--account-id Display account id and exit
2085
+ --new-account-key Replace the account key with a new one
2086
+ --DEACTIVATE-account Permanently deactivate account
2082
2087
2083
2088
_EOF_
2084
2089
}
@@ -2326,11 +2331,13 @@ obtain_ca_resource_locations()
2326
2331
URL_new_reg=$( echo " $ca_all_loc " | grep " new-reg" | awk -F' "' ' {print $4}' )
2327
2332
URL_new_authz=$( echo " $ca_all_loc " | grep " new-authz" | awk -F' "' ' {print $4}' )
2328
2333
URL_new_cert=$( echo " $ca_all_loc " | grep " new-cert" | awk -F' "' ' {print $4}' )
2334
+ URL_keyChange=$( echo " $ca_all_loc " | grep " key-change" | awk -F' "' ' {print $4}' )
2329
2335
# API v2
2330
2336
URL_newAccount=$( echo " $ca_all_loc " | grep " newAccount" | awk -F' "' ' {print $4}' )
2331
2337
URL_newNonce=$( echo " $ca_all_loc " | grep " newNonce" | awk -F' "' ' {print $4}' )
2332
2338
URL_newOrder=$( echo " $ca_all_loc " | grep " newOrder" | awk -F' "' ' {print $4}' )
2333
2339
URL_revoke=$( echo " $ca_all_loc " | grep " revokeCert" | awk -F' "' ' {print $4}' )
2340
+ URL_keyChange=$( echo " $ca_all_loc " | grep " keyChange" | awk -F' "' ' {print $4}' )
2334
2341
2335
2342
if [[ -n " $URL_new_reg " ]] || [[ -n " $URL_newAccount " ]]; then
2336
2343
break
@@ -2708,7 +2715,7 @@ urlbase64_decode() {
2708
2715
usage () { # echos out the program usage
2709
2716
echo " Usage: $PROGNAME [-h|--help] [-d|--debug] [-c|--create] [-f|--force] [-a|--all] [-q|--quiet]" \
2710
2717
" [-Q|--mute] [-u|--upgrade] [-X|--experimental tag] [-U|--nocheck] [-r|--revoke cert key] [-w working_dir]" \
2711
- " [--preferred-chain chain] [--account-id] domain"
2718
+ " [--preferred-chain chain] [--account-id] [--new-account-key] [--DEACTIVATE-account] domain"
2712
2719
}
2713
2720
2714
2721
write_domain_template () { # write out a template file for a domain.
@@ -2944,6 +2951,10 @@ while [[ -n ${1+defined} ]]; do
2944
2951
shift ; PREFERRED_CHAIN=" $1 " ;;
2945
2952
--account-id)
2946
2953
_SHOW_ACCOUNT_ID=1 ;;
2954
+ --new-account-key)
2955
+ _NEW_ACCOUNT_KEY=1 ;;
2956
+ --DEACTIVATE-account)
2957
+ _DEACTIVATE_ACCOUNT=1 ;;
2947
2958
--source)
2948
2959
return ;;
2949
2960
-* )
@@ -3493,7 +3504,7 @@ elif [[ "$code" == '200' ]] ; then
3493
3504
if [[ " $code " == ' 200' ]]; then
3494
3505
info " - update succeeded"
3495
3506
else
3496
- info " - updaate failed"
3507
+ info " - update failed"
3497
3508
fi
3498
3509
debug responseHeaders " $responseHeaders "
3499
3510
fi
@@ -3507,6 +3518,54 @@ if [[ ${_SHOW_ACCOUNT_ID} -eq 1 ]]; then
3507
3518
fi
3508
3519
# end of registering account with CA
3509
3520
3521
+ # Current account key is OK, create a new one if requested
3522
+ if [[ ${_NEW_ACCOUNT_KEY} == 1 ]]; then
3523
+ info " creating a new ${ACCOUNT_KEY_TYPE} account key"
3524
+ create_key " $ACCOUNT_KEY_TYPE " " ${ACCOUNT_KEY} .new" " $ACCOUNT_KEY_LENGTH "
3525
+ # Inner = old key, signed by new
3526
+ inpay=' {"account":"' " $KID " ' ","oldKey":' " $jwk " ' }'
3527
+ debug " Inner payload: $inpay "
3528
+ inpay64=" $( printf ' %s' " $inpay " | urlbase64) "
3529
+ get_signing_params " ${ACCOUNT_KEY} .new"
3530
+ inprot=' {"alg": "' " $jwkalg " ' ", "jwk": ' " $jwk " ' , "url":"' " $URL_keyChange " ' "}'
3531
+ debug " Inner protected: $inprot "
3532
+ inprot64=" $( printf ' %s' " $inprot " | urlbase64) "
3533
+ sign_string " $( printf ' %s' " ${inprot64} .${inpay64} " ) " " ${ACCOUNT_KEY} .new" " $signalg "
3534
+ inner=' {"protected":"' " $inprot64 " ' ","payload":"' " $inpay64 " ' ","signature":"' " $signed64 " ' "}'
3535
+ debug " Inner body: $inner "
3536
+ # Outer = inner, signed by old
3537
+ get_signing_params " ${ACCOUNT_KEY} "
3538
+ send_signed_request " $URL_keyChange " " $inner "
3539
+ debug responseHeaders " $responseHeaders "
3540
+ if [[ " $code " == ' 200' ]]; then
3541
+ info " - update succeeded"
3542
+ mv " ${ACCOUNT_KEY} " " ${ACCOUNT_KEY} .old"
3543
+ mv " ${ACCOUNT_KEY} .new" " ${ACCOUNT_KEY} "
3544
+ else
3545
+ info " - update failed"
3546
+ rm -f " ${ACCOUNT_KEY} .new"
3547
+ if [[ " $code " == ' 409' ]]; then
3548
+ other=$( echo " $responseHeaders " | grep -i " ^location" | awk ' {print $2}' | tr -d ' \r\n ' )
3549
+ error_exit " new key is in use by $other "
3550
+ fi
3551
+ fi
3552
+ graceful_exit
3553
+ fi
3554
+ # end of new account key
3555
+
3556
+ # Permanently deactivate account
3557
+ if [[ ${_DEACTIVATE_ACCOUNT} -eq 1 ]]; then
3558
+ echo " PERMANENTLY deactivating account"
3559
+ send_signed_request " $KID " ' {"status":"deactivated"}'
3560
+ if [[ " $code " == ' 200' ]]; then
3561
+ info " - Account has been deactivated - it can NOT be revived"
3562
+ else
3563
+ info " - deactivation failed"
3564
+ fi
3565
+ debug responseHeaders " $responseHeaders "
3566
+ fi
3567
+ # end of deactivate account
3568
+
3510
3569
# verify each domain
3511
3570
info " Verify each domain"
3512
3571
0 commit comments