|
#!/bin/bash |
|
# Certbot automated renewal script by AfroThundr |
|
# Uses the tls-alpn-01 challenge for renewal |
|
# This runs twice since I use two certificates (RSA and ECDSA) |
|
# Version 1.2.2 updated 20190509 |
|
|
|
# Declare some variables... |
|
dom=example.com |
|
cfg=/etc/letsencrypt/cli.ini |
|
dirs=( /etc/ssl/private/letsencrypt{1,2} ) |
|
service=apache2 |
|
|
|
cbot="certbot certonly --standalone --preferred-challenges tls-alpn-01 \ |
|
--config $cfg --keep-until-expiring --agree-tos --expand" |
|
|
|
for dir in ${dirs[@]}; do |
|
# Check if cert is close to expiring first |
|
printf 'Checking for certificate expiration...\n' |
|
now=$(date -ud "now" +%s) |
|
exp=$(date -ud "$(openssl x509 -in ${dir}/${dom}.crt -enddate -noout | |
|
cut -d= -f 2)" +%s) |
|
days_exp=$(bc <<< "( $exp - $now ) / 86400") |
|
|
|
# Begin renewal process only if cert is expiring soon |
|
if [[ $days_exp -le ${days_min:=3} ]]; then |
|
printf 'Certificate expiring soon, proceeding with renewal.\n' |
|
|
|
# Stop web server if running, then leave flag |
|
[[ $RENEW == true ]] || { systemctl stop $service; RENEW=true; } |
|
|
|
# Backup existing files, then renew cert |
|
if [[ -f ${dir}/${dom}.crt ]]; then |
|
mv ${dir}/${dom}.crt{,.bak} |
|
mv ${dir}/ca-chain.pem{,.bak} |
|
mv ${dir}/${dom}.pem{,.bak} |
|
fi |
|
|
|
printf 'Running renewal on %s\n' "${dir}/${dom}.crt" |
|
$cbot --csr ${dir}/${dom}.csr --cert-path ${dir}/${dom}.crt \ |
|
--chain-path ${dir}/ca-chain.pem --fullchain-path ${dir}/${dom}.pem |
|
|
|
# If successful, remove backups; if not, revert |
|
if [[ -f ${dir}/${dom}.crt ]]; then |
|
rm -f ${dir}/*.bak |
|
chmod 0600 ${dir}/* |
|
else |
|
mv ${dir}/${dom}.crt{.bak,} |
|
mv ${dir}/ca-chain.pem{.bak,} |
|
mv ${dir}/${dom}.pem{.bak,} |
|
fi |
|
|
|
printf 'Certificate renewal complete.\n' |
|
fi |
|
|
|
# Start web server, if stopped by us |
|
[[ $RENEW == true ]] && systemctl start $service |
|
done |
|
|
|
# Nothing to do, time to go. |
|
printf 'Certificates are up to date, exiting.\n' |
|
exit 0 |