|
#!/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.3 updated 20240304 |
|
# SPDX-License-Identifier: GPL-3.0-or-later |
|
|
|
# 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 |