过期的 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"。