過期的 SSL 證書會導致瀏覽器顯示整頁安全警告,阻止訪客訪問你的網站。以下是檢查證書過期時間和設定監控的方法。
透過瀏覽器檢查
- 使用
https://訪問你的網站 - 點選位址列中的鎖頭圖示
- 點選 “證書” 或 “連線是安全的” → “證書有效”
- 檢視 “有效期至” 或 “到期日期”
使用 OpenSSL 檢查(命令列)
遠端檢查(從任何機器)
echo | openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 2>/dev/null | openssl x509 -noout -enddate
輸出:notAfter=Aug 5 12:00:00 2026 GMT
本地檔案檢查
openssl x509 -noout -enddate -in /etc/ssl/gethttps/fullchain.pem
一次檢視所有詳情
echo | openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 2>/dev/null | openssl x509 -noout -subject -issuer -dates
一行指令碼檢查
檢查證書是否在 30 天內過期:
if openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 2>/dev/null | openssl x509 -noout -checkend 2592000 > /dev/null 2>&1; then
echo "Certificate is valid for at least 30 more days"
else
echo "WARNING: Certificate expires within 30 days!"
fi
批次檢查多個域名
如果你管理多個域名,用迴圈一次性檢查:
for domain in example.com www.example.com api.example.com; do
expiry=$(echo | openssl s_client -connect "$domain":443 -servername "$domain" 2>/dev/null | openssl x509 -noout -enddate 2>/dev/null | cut -d= -f2)
echo "$domain — expires: $expiry"
done
使用 cron 自動監控
建立一個每日 cron 任務,在證書即將在 30 天內過期時傳送郵件提醒:
#!/bin/bash
# Save as /usr/local/bin/check-ssl-expiry.sh
DOMAINS="example.com www.example.com api.example.com"
WARN_DAYS=30
WARN_SECS=$((WARN_DAYS * 86400))
for domain in $DOMAINS; do
if ! echo | openssl s_client -connect "$domain":443 -servername "$domain" 2>/dev/null | \
openssl x509 -noout -checkend $WARN_SECS > /dev/null 2>&1; then
echo "WARNING: $domain certificate expires within $WARN_DAYS days" | \
mail -s "SSL Expiry Warning: $domain" admin@example.com
fi
done
新增到 crontab:0 9 * * * /usr/local/bin/check-ssl-expiry.sh
設定監控服務
如需更可靠的方案,使用監控服務:
| 方式 | 如何操作 | 費用 | 告警方式 |
|---|---|---|---|
| 日曆提醒 | 設定在簽發後 60 天 | 免費 | 手動 |
| Cron 指令碼 | 每日執行檢查指令碼 | 免費 | 郵件 |
| UptimeRobot | 新增 SSL 監控,設定告警閾值 | 免費版 | 郵件、Slack、Webhook |
| Better Uptime | SSL 監控配合事件管理 | 免費版 | 郵件、簡訊、Slack |
| Certbot 自動續簽 | 透過 systemd timer 執行 certbot renew | 免費 | 完全防止過期 |
對於 Let’s Encrypt 的 90 天證書,建議在第 60 天續簽(留出 30 天緩衝)。
應該驗證哪些證書詳情?
除了過期日期,定期檢查:
echo | openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 2>/dev/null | openssl x509 -noout -text | grep -E 'Subject:|Issuer:|Not After|DNS:'
這會顯示:
- Subject/SAN — 證書覆蓋了正確的域名
- Issuer — 由預期的憑證授權機構簽發(如 Let’s Encrypt)
- Not After — 過期日期
- DNS names — SAN 欄位中的所有域名
常見問題
證書過期會怎樣?
瀏覽器會顯示整頁警告,如”您的連線不是私密連線”(Chrome)或”警告:面臨潛在的安全風險”(Firefox)。大多數訪客會立即離開。搜尋引擎也可能降低排名或從索引中移除你的頁面,直到證書續簽。
應該多久檢查一次?
如果你有自動續簽(Certbot),每月檢查一次作為安全保障。如果手動續簽(GetHTTPS),在第 50 天檢查並在第 60 天設定硬性提醒。隨著 2029 年證書有效期縮短到 47 天,監控變得更加關鍵。
沒有命令列許可權能檢查過期時間嗎?
可以。SSL Labs Server Test 和 SSL Shopper 的 SSL Checker 等線上工具可以顯示證書詳情(包括過期日期)——只需輸入你的域名。瀏覽器 DevTools 也能看到(鎖頭圖示 → 證書詳情)。
證書已經過期了怎麼辦?
立即續簽。訪問 GetHTTPS 獲取新證書,替換伺服器上的檔案,然後重新載入 Web 伺服器。整個過程只需 5 分鐘。讓證書過期沒有任何懲罰——續簽並安裝新證書即可。
可以用一個指令碼監控多個域名嗎?
可以。以下指令碼檢查你所有的域名並輸出剩餘天數:
#!/bin/bash
for domain in example.com www.example.com api.example.com; do
expiry=$(echo | openssl s_client -connect "$domain":443 -servername "$domain" 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)
days_left=$(( ($(date -d "$expiry" +%s) - $(date +%s)) / 86400 ))
if [ "$days_left" -lt 30 ]; then
echo "WARNING $domain: $days_left days left"
else
echo "OK $domain: $days_left days left"
fi
done
注意:date -d 語法僅適用於 Linux。在 macOS 上使用 date -j -f "%b %d %H:%M:%S %Y %Z"。