#!/bin/bash
#### README ####
#
# This extension attribute finds the expiration date of a certificate and reports the remaining days before expiration to JAMF.
# If you have more than one certificate with the same Common Name, it uses the expiration date of the latest valid certificate.
#
#### USER VARIABLES ####
# Fill with full or partial Common Name of the certificate
CERT_CN=""
cert-exp-dates () {
/usr/bin/security find-certificate -a -c $CERT_CN -p > /tmp/certs.pem
# This while loop shamelessly pilfered from a Stack Overflow answer: https://stackoverflow.com/questions/56412146/is-it-possible-to-loop-through-osx-keychain-certificates-in-a-bash-array
# Loops through each certificate and pulls a list of expiration dates
while read -r line; do
if [[ "$line" == *"--BEGIN"* ]]; then
cert=$line
else
cert="$cert"$'\n'"$line"
if [[ "$line" == *"--END"* ]]; then
echo "$cert" > /tmp/checkcert.pem
notafter=$(openssl x509 -noout -enddate -in /tmp/checkcert.pem | cut -d= -f 2)
# Convert to ISO 8601
dates=$(date -j -f "%b %d %H:%M:%S %Y %Z" "$notafter" +"%Y%m%d")
echo "$dates"
fi
fi
done < /tmp/certs.pem
}
# Only show expiration of most recent certificate
exp_date="$(cert-exp-dates | sort -n | tail -n1)"
# Report a null value and exit script if there are no matching certificates
if [ -z "$exp_date" ]; then
echo ""
exit 0
fi
# Calculate days between today and expiration date
days_remain=$(( ($(date -jf %Y%m%d "$exp_date" +%s) - $(date +%s) ) / 86400))
# Report for JAMF
echo "$days_remain"
# Cleanup
rm /tmp/certs.pem
exit 0