所有部署指南 部署

如何检查 SSL 证书过期时间

过期的 SSL 证书会导致浏览器显示整页安全警告,阻止访客访问你的网站。以下是检查证书过期时间和设置监控的方法。

通过浏览器检查

  1. 使用 https:// 访问你的网站
  2. 点击地址栏中的锁头图标
  3. 点击 “证书”“连接是安全的” → “证书有效”
  4. 查看 “有效期至”“到期日期”

使用 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 UptimeSSL 监控配合事件管理免费版邮件、短信、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"

相关文章

快速开始 2026-05-07
如何续签 Let's Encrypt 证书
Let's Encrypt 证书每 90 天过期。了解如何通过 GetHTTPS(手动)或 Certbot(自动)续签,并为 47 天有效期做好准备。
SSL 与证书 2026-05-07
SSL 证书有效期:47 天变更详解
CA/Browser Forum 投票决定到 2029 年将 SSL 证书有效期缩短至 47 天。了解时间线、对你网站的影响,以及如何准备。
部署 2026-05-08
如何在 Nginx 上安装 SSL 证书
在 Nginx 上安装 SSL 证书的分步指南。涵盖文件上传、完整 server 块配置、TLS 最佳实践、HTTP/2、HSTS、重定向设置、测试以及 6 个常见错误的排查方法。
在浏览器中获取免费 SSL 证书
无需安装,无需账号。私钥始终留在你的设备上。
获取证书