Skip to main content

Auto-renew self-signed OpenSSL certificates

Problem

So you have generated self-signed certificates using OpenSSL and you want it to automatically renew once its expiry date is less than 30 days!

Solution

You can use the following bash script and place it inside crontab which runs once every day to accomplish the above problem.

#!/bin/bash

location=$1
crt_loc="$location/certificate.crt"
key_loc="$location/key.key"

# 30 days is default on warnings - overridden on command line with '-d':
days_to_warn=30
epoch_day=86400
epoch_warning=$((days_to_warn*epoch_day))

today_epoch="$(date +%s)"

expire_date=$(openssl x509 -noout -dates -in $crt_loc | awk -F= '/^notAfter/ { print $2; exit }')
expire_epoch=$(date +%s -d "$expire_date")

timeleft=`expr $expire_epoch - $today_epoch`

if [[ $timeleft -le $epoch_warning ]]; then #RENEW
generate_new=$(openssl req -new -newkey rsa:4096 -x509 -sha256 -days 365 -nodes -out /tmp/new_certificate.crt -keyout /tmp/new_key.key -subj "/C=PK/ST=XYZ/L=XYZ/O=XYZ/OU=XYZ/CN=XYZ")
sudo mv /tmp/new_certificate.crt $crt_loc
sudo mv /tmp/new_key.key $key_loc
else
echo "NOT EXPIRED"
fi

This script accepts the folder path which contains certificates (certificate.crt & key.key) files and then performs various expiry checks if expired, it generates new certificates and overwrites the previous ones at the given location.

References