Cara Kirim Notifikasi Otomatis SSL Expired via Email (Lengkap + Bash Script)

Mengelola sertifikat SSL secara otomatis sangat penting untuk mencegah gangguan layanan akibat sertifikat yang kedaluwarsa. Dalam panduan ini, kita akan membuat script Bash otomatis untuk mengecek masa aktif SSL, menampilkan hasilnya di terminal, dan mengirimkan laporan via email setiap hari menggunakan msmtp
, lengkap dengan konversi waktu ke WIB (GMT+7).
Panduan ini sangat cocok untuk admin server, DevOps, atau pemilik website yang menggunakan Let’s Encrypt dan ingin memastikan sertifikat SSL mereka selalu aktif.
๐ง Fitur Utama Script
- โ
Mendukung multi domain SSL (misal:
masdika.biz.id
,www.masdika.biz.id
) - ๐ Menampilkan sisa hari sebelum expired
- ๐ง Mengirim email harian berisi status semua SSL
- ๐จ Jika tinggal sedikit hari (default: 1), langsung kirim peringatan
- ๐ Konversi waktu dari GMT ke WIB (Asia/Jakarta)
- ๐จ Desain HTML email yang modern dan responsif (dark navy)
๐งฉ Prasyarat
Sebelum menggunakan script ini, pastikan:
- ๐ง Sistem Linux memiliki paket
openssl
,date
, danmsmtp
- ๐ Sudah tersedia file sertifikat
.crt
hasil dari Let’s Encrypt / Caddy - โ๏ธ Konfigurasi SMTP sudah siap di
~/.msmtprc
(contoh: Gmail, Mailgun, Mailjet)
๐ซ Contoh Konfigurasi Gmail di ~/.msmtprc
Jika kamu menggunakan Gmail, pastikan:
- Akun Gmail kamu mengaktifkan 2-Step Verification
- Kamu telah membuat App Password (16 digit) dari https://myaccount.google.com/apppasswords
Lalu isi konfigurasi ~/.msmtprc
seperti ini:
# ~/.msmtprc
defaults
auth on
tls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile ~/.msmtp.log
account gmail
host smtp.gmail.com
port 587
from [email protected]
user [email protected]
password 16_DIGIT_APP_PASSWORD
account default : gmail
๐ Script Lengkap: ssl_renew_notifier.sh
#!/bin/bash
export TZ="Asia/Jakarta"
EMAIL="[email protected]"
WARNING_DAYS=1
CERT_PATHS=(
"data/caddy_data/caddy/certificates/acme-v02.api.letsencrypt.org-directory/masdika.biz.id/masdika.biz.id.crt"
"data/caddy_data/caddy/certificates/acme-v02.api.letsencrypt.org-directory/www.masdika.biz.id/www.masdika.biz.id.crt"
)
html_header='<html><body style="background-color:#0d1b2a;color:#ffffff;font-family:sans-serif;padding:20px;"><h2 style="color:#00b4d8;">๐ Laporan Status SSL</h2><ul>'
html_footer='</ul><p style="margin-top:40px;font-size:12px;border-top:1px solid #444;padding-top:10px;">Email ini dikirim otomatis oleh server <b>masdika.biz.id</b> pada zona waktu <b>WIB (GMT+7)</b></p></body></html>'
html_content=""
send_email() {
local subject="$1"
local body="$2"
local encoded_subject
encoded_subject=$(echo -n "$subject" | base64)
{
echo "To: $EMAIL"
echo "Subject: =?UTF-8?B?$encoded_subject?="
echo "Content-Type: text/html; charset=UTF-8"
echo ""
echo "$body"
} | msmtp -t
}
for cert_path in "${CERT_PATHS[@]}"; do
if [ -f "$cert_path" ]; then
domain=$(basename "$cert_path" .crt)
expiry_raw=$(openssl x509 -enddate -noout -in "$cert_path" | cut -d= -f2)
expiry_epoch=$(date -u -d "$expiry_raw" +%s)
expiry_date=$(date -d "@$expiry_epoch" '+%Y-%m-%d %H:%M:%S WIB')
now_epoch=$(date +%s)
days_left=$(( (expiry_epoch - now_epoch) / 86400 ))
echo "โ
$domain: $days_left hari tersisa (exp: $expiry_date)"
html_content+="<li><b>$domain:</b> $days_left hari tersisa (exp: $expiry_date)</li>"
if (( days_left <= WARNING_DAYS )); then
echo "โ ๏ธ $domain akan expired dalam $days_left hari, mengirim email..."
send_email "โ ๏ธ Peringatan SSL $domain tinggal $days_left hari lagi" "$html_header$html_content$html_footer"
exit 0
fi
else
echo "๐ซ Sertifikat tidak ditemukan: $cert_path"
html_content+="<li style='color:#ff6b6b;'><b>$cert_path:</b> Sertifikat tidak ditemukan</li>"
fi
done
send_email "๐ Info Status SSL masdika.biz.id" "$html_header$html_content$html_footer"
โฑ๏ธ Jadwalkan Cron Harian
Buka crontab:
crontab -e
Lalu tambahkan:
0 7 * * * /path/ke/ssl_renew_notifier.sh
โฐ Script akan dijalankan setiap pagi jam 07:00 WIB.
๐งช Tes Manual
Jalankan script langsung:
bash ssl_renew_notifier.sh
Jika berhasil, kamu akan menerima email seperti ini:

- ๐ฌ Subjek:
๐ Info Status SSL masdika.biz.id
- ๐ Isi: HTML berisi list domain dan masa aktif SSL
โ Selesai
Dengan sistem ini, kamu akan selalu tahu status sertifikat SSL kamu tanpa harus cek manual. Notifikasi bisa diperluas ke Telegram, Discord, atau logging file jika diinginkan.