Masdika Loading..
Masdika.ID

DevOps Engineer

Cloud Engineer

System Administrator

  • Home
  • Portfolio
  • Services
  • Resume
  • Skills
  • Blog
  • Contact
Masdika.ID

DevOps Engineer

Cloud Engineer

System Administrator

Download CV

Recent Posts

  • Dari Laptop Bekas Jadi Server Pribadi: Cara Membangun Home Server Murah Menggunakan ISP MyRepublic dengan Public IP
  • Pembuatan Subnet dan Alokasi IP Address pada Amazon Web Service VPC
  • Instalasi dan Konfigurasi AWS CLI pada EC2 (Lab Guide)
  • Membangun Arsitektur Web + Database Highly Available di AWS (RDS Multi-AZ)
  • Cara Reset Password OpenBSD di Proxmox via VNC

Recent Comments

  1. Alif on Jangan Gunakan latest Tag pada Docker Images! Ini Alasannya
  2. Sahrull on Panduan Lengkap Anti-DDoS: Installasi Iptables, Hardening, dan Cloudflare Proxy
  3. VSTRA on Cara Cerdas Menguasai Kubernetes (K8s): Panduan Lengkap Orkestrasi Kontainer untuk Developer Modern
  4. Rikiy on Cara Mudah Deploy Website Node.js Menggunakan Docker
  5. Masdika.BIZ.ID on Disaster Recovery Cluster (DRC) WordPress dengan MariaDB Galera dan Load Balancer Caddy

Categories

  • Tutorial

Masdika.ID

  • About
  • Terms & Conditions
  • Privacy Policy
BLOG POST

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

July 30, 2025 Tutorial by Masdika.ID
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.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, dan msmtp
  • ๐Ÿ” 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 masdika@gmail.com
user masdika@gmail.com
password 16_DIGIT_APP_PASSWORD

account default : gmail

๐Ÿ“œ Script Lengkap: ssl_renew_notifier.sh

#!/bin/bash

export TZ="Asia/Jakarta"

EMAIL="me@masdika.id"
WARNING_DAYS=1
CERT_PATHS=(
  "data/caddy_data/caddy/certificates/acme-v02.api.letsencrypt.org-directory/masdika.id/masdika.id.crt"
  "data/caddy_data/caddy/certificates/acme-v02.api.letsencrypt.org-directory/www.masdika.id/www.masdika.id.crt"
)

# ==============================
# HTML Email Template (Masdika Branding)
# ==============================
html_header='<!DOCTYPE html><html><body style="background-color:#0d1b2a;margin:0;padding:0;font-family:Segoe UI,Arial,sans-serif;color:#ffffff;">
  <!-- HEADER -->
  <div style="max-width:600px;margin:auto;background:linear-gradient(90deg,#436D21,#5a8d34);padding:28px 20px;text-align:center;border-radius:0 0 12px 12px;">
    <h1 style="margin:0;font-size:22px;color:#ffffff;font-weight:700;">
      ๐Ÿ”’ SSL Status Report
    </h1>
    <p style="margin:6px 0 0 0;font-size:13px;color:#d4f8c0;">
      Sistem monitoring otomatis Masdika.ID
    </p>
  </div>

  <!-- CONTENT WRAPPER -->
  <div style="max-width:600px;margin:20px auto;background:#1b263b;padding:20px;border-radius:12px;box-shadow:0 4px 12px rgba(0,0,0,0.4);">
  <h2 style="margin-top:0;color:#9acd6d;font-size:18px;font-weight:600;">
    Laporan Status SSL
  </h2>
  <ul style="list-style:none;padding:0;margin:20px 0;">'

html_footer='</ul>
  </div>

  <!-- FOOTER -->
  <div style="max-width:600px;margin:20px auto;text-align:center;color:#ccc;font-size:12px;padding:15px;">
    <p style="margin:0;border-top:1px solid #2d3a4a;padding-top:10px;">
      Email ini dikirim otomatis oleh <b style="color:#9acd6d;">Masdika.ID</b><br>
      Zona waktu: <b>WIB (GMT+7)</b>
    </p>
    <p style="margin-top:8px;font-size:11px;opacity:0.7;">
      ยฉ 2025 Masdika.ID โ€“ DevOps Engineer | Cloud & SysAdmin
    </p>
  </div>
</body></html>'
html_content=""

# ==============================
# Send Email Function
# ==============================
send_email() {
  local subject="$1"
  local body="$2"
  local encoded_subject
  encoded_subject=$(echo -n "$subject" | base64)

  {
    echo "From: Masdika SSL Monitor <no-reply@masdika.id>"
    echo "To: $EMAIL"
    echo "Subject: =?UTF-8?B?$encoded_subject?="
    echo "Content-Type: text/html; charset=UTF-8"
    echo ""
    echo "$body"
  } | msmtp -a default -t
}

# ==============================
# Check Certificates
# ==============================
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 style='margin:10px 0;padding:12px;border-radius:8px;background:#243447;'>
      <b style='color:#9acd6d;'>$domain</b><br>
      โณ <span style='color:#fff;'>$days_left hari tersisa</span>
      <span style='color:#888;font-size:13px;'>(exp: $expiry_date)</span>
    </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='margin:10px 0;padding:12px;border-radius:8px;background:#3c2a2a;color:#ff6b6b;'>
      <b>$cert_path</b><br> Sertifikat tidak ditemukan
    </li>"
  fi
done

# ==============================
# Send Final Status Email
# ==============================
send_email "๐Ÿ“‹ Info Status SSL masdika.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.

Share:
Tags: BashLet's Encryptssl
Related Posts
Membangun Jenkins Production Stabil dengan Inbound Agent dan Traefik SSL

Panduan ini menjelaskan instalasi Jenkins production menggunakan Docker + Traefik (SSL otomatis via DNS Challenge Cloudflare), dengan fokus utama pada…

Instalasi SSL Let’s Encrypt di Proxmox VE via Web UI

Let’s Encrypt adalah layanan gratis untuk membuat sertifikat SSL agar akses web Proxmox menjadi aman (HTTPS). Mulai dari versi 6.3,…

Post navigation

Prev
Next
Write a comment Cancel Reply


ยฉ 2025 www.masdika.id โ€” Semua hak cipta dilindungi