一、结论
SSL 证书到期时间可以通过浏览器证书详情、openssl 命令或网站监控工具查询;如果要管理多个域名,建议建立域名清单,并用脚本或监控系统批量检测证书剩余天数。操作成功后,应能看到每个域名当前线上证书的 notAfter 到期时间,并在证书临期时收到提醒。
二、准备工作
查询证书到期时间通常不需要修改网站配置,但批量监测和提醒需要准备以下内容:
1. 可访问目标域名的网络环境
查询工具需要能访问目标站点的 443 端口。如果站点只允许内网访问,监测工具也需要部署在可访问该内网的位置。
2. 域名清单
列出需要监测的域名,例如:
example.comwww.example.comapi.example.compay.example.com
3. 服务器或监控机执行权限
如果使用脚本或监控系统,需要有一台能定时执行任务的 Linux 服务器、监控服务器或运维机。
4. 告警通知渠道
例如邮件、企业微信、钉钉、飞书、Slack 或现有监控告警通道。脚本本身只负责发现临期证书,实际提醒需要依赖通知渠道。
5. 续期或更换证书所需权限
如果监测发现证书即将到期,后续处理可能需要:
- 域名管理员:配合完成 DNS 验证或域名授权;
- 证书申请者:在证书平台重新申请或确认自动续期状态;
- 服务器管理员:替换证书文件、重载服务或检查反向代理配置。
三、操作步骤
1. 用浏览器查看单个证书到期时间
适合临时检查某个网站。
操作方式:
1. 用浏览器访问 https://example.com。
2. 点击地址栏锁形标识。
3. 查看证书信息。
4. 找到“有效期至”“到期时间”或 Not After 字段。
正常结果:能看到当前网站证书的颁发者、域名范围和到期时间。
这种方法适合人工抽查,但不适合批量监测。
2. 用 OpenSSL 查询线上证书到期时间
适合在服务器或运维机上快速确认真实对外服务的证书。
以 example.com 为例:
```bash
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -enddate
```
正常返回类似:
```text
notAfter=Aug 30 12:00:00 2026 GMT
```
如果站点使用非标准端口,例如 8443:
```bash
echo | openssl s_client -connect example.com:8443 -servername example.com 2>/dev/null | openssl x509 -noout -enddate
```
-servername 参数很重要。同一个 IP 上可能部署多个 HTTPS 站点,不加 SNI 可能查到错误证书。
3. 建立批量查询脚本
如果有多个域名,可以把域名写入列表,然后批量查询剩余天数。
示例域名清单:
```text
example.com
www.example.com
api.example.com
```
简单 Shell 检测思路:
```bash
#!/usr/bin/env bash
warn_days=30
while read -r domain; do
end_date=$(echo | openssl s_client -connect "${domain}:443" -servername "${domain}" 2>/dev/null \
| openssl x509 -noout -enddate | cut -d= -f2)
if [ -z "$end_date" ]; then
echo "FAIL ${domain}"
continue
fi
end_ts=$(date -d "$end_date" +%s)
now_ts=$(date +%s)
days_left=$(( (end_ts - now_ts) / 86400 ))
echo "${domain} ${end_date} ${days_left} days"
if [ "$days_left" -le "$warn_days" ]; then
echo "WARNING: ${domain} certificate expires in ${days_left} days"
fi
done < domains.txt
```
正常结果:脚本会输出每个域名的到期时间和剩余天数。当剩余天数小于等于设定阈值时,会输出告警信息。
实际使用时,可以把 echo WARNING 替换为邮件、Webhook 或现有告警系统通知。
4. 设置定时监测任务
批量监测需要定时执行,否则只在手动运行时有效。
在 Linux 上可以使用 cron。例如每天检查一次:
```bash
crontab -e
```
添加类似任务:
```text
0 9 * * * /opt/scripts/check_ssl_expiry.sh >> /var/log/ssl_expiry.log 2>&1
```
含义是每天 09:00 执行脚本,并把结果写入日志。
正常结果:日志中会持续记录每个域名的证书剩余天数。临期域名会触发告警。
5. 接入现有监控系统
如果已有监控平台,可以优先使用现有系统,而不是单独维护脚本。
常见的批量监测方式包括:
1. Zabbix、Nagios、Icinga 等传统监控系统
通过 TLS 检查插件或自定义脚本监测证书到期时间,并配置阈值告警。
2. Prometheus 加 Blackbox Exporter 等探测组件
对 HTTPS 目标进行探测,采集证书相关信息,再通过告警规则判断是否临期。
3. 网站可用性监控服务
部分监控服务支持 SSL 证书到期提醒。使用前需要确认其是否支持你的域名数量、检测频率、通知方式和内网环境。
选择时可以重点看:
- 是否支持批量域名导入;
- 是否能区分证书剩余天数告警;
- 是否支持多阈值提醒,例如 30 天、14 天、7 天;
- 是否能检测源站真实证书,而不是只检测 CDN 或反向代理证书;
- 是否支持告警恢复通知,避免误以为问题已处理。
6. 发现临期后检查续期与部署状态
监测工具只能提醒,证书更新还需要完成续期和部署。
如果发现证书即将到期,应检查:
1. 当前证书是否已经提交续期申请;
2. 域名验证是否仍然有效;
3. 新证书是否已经签发;
4. 新证书和私钥是否已经部署到 Web 服务器、负载均衡、CDN 或网关;
5. 服务是否已经重载并对外生效。
如果使用了自动续期能力,也要确认自动续期后的新证书是否真正部署到了实际服务。申请成功、签发成功和线上生效不是同一件事。
四、如何确认操作成功
可以从以下几个方面验收:
1. 单域名查询成功
使用浏览器或 openssl 能看到当前证书的 notAfter 时间。
2. 批量脚本输出完整
域名清单中的每个域名都有结果,没有大量 FAIL。
3. 剩余天数计算正确
脚本输出的剩余天数与浏览器证书详情中的到期时间基本一致。
4. 告警能真实送达
可以临时构造一个低阈值,例如把 warn_days 改成大于当前剩余天数的值,测试是否能收到通知。
5. 线上证书已更新
如果进行了续期或更换,应再次执行:
```bash
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -enddate
```
确认返回的是新证书到期时间,而不是旧证书。
五、常见错误与处理
1. 命令超时或连接失败
现象:
```text
connect: Connection timed out
```
或脚本显示 FAIL。
可能原因:
- 目标站点未开放 443 端口;
- 防火墙或安全组拦截;
- 监测机无法访问目标网络;
- 站点只允许内网访问。
处理方法:
```bash
telnet example.com 443
```
或使用:
```bash
nc -vz example.com 443
```
如果连接失败,先检查网络、端口和服务监听状态。
2. 查询到的证书不是目标站点的证书
现象:返回的证书域名与预期不一致。
常见原因:
- 同一服务器上有多个 HTTPS 站点;
- 未使用
-servername指定 SNI; - 请求到了默认站点或错误虚拟主机。
处理方法:确保命令中包含 -servername:
```bash
openssl s_client -connect example.com:443 -servername example.com
```
3. CDN、负载均衡和源站证书不一致
现象:外部访问显示证书正常,但源站证书已经过期。
常见原因:
- 用户访问的是 CDN、WAF 或负载均衡提供的证书;
- 源站证书由另一套流程管理;
- 回源使用 HTTPS,但源站证书未被监测。
处理方法:分别监测对外域名和源站地址。如果源站不能直接访问,可通过指定 Host、内网地址或专用检测入口检查源站证书。
4. 脚本时间或时区计算异常
现象:剩余天数明显不正确,例如刚更换证书却显示已过期。
可能原因:
- 服务器时间不准确;
- 脚本解析日期格式失败;
- 系统时区与证书时间理解不一致。
处理方法:
```bash
date
```
检查服务器时间是否准确,必要时配置 NTP 时间同步。同时确认脚本能正确解析 notAfter 输出。
5. 自动续期成功但线上仍显示旧证书
现象:证书平台显示新证书已签发,但线上查询仍是旧到期时间。
可能原因:
- 新证书未部署;
- 服务未重载;
- 多节点中部分节点仍是旧证书;
- 负载均衡或 CDN 缓存了旧证书;
- 部署路径错误,服务仍读取旧文件。
处理方法:
1. 保留旧证书和旧配置备份;
2. 检查新证书文件路径和私钥匹配情况;
3. 重载或重启对应服务;
4. 对多个节点分别执行 openssl 检查;
5. 确认无异常后再清理旧文件。
六、更简单的方案
如果你只是偶尔查一两个域名,用浏览器或 openssl 命令即可。但如果域名较多、证书更新频繁,或者希望减少手动申请和反复续期操作,可以考虑使用证书管理平台配合监测工具。
对于需要免费申请和管理 SSL 证书的场景,七彩云证书平台 可以作为选择之一。它支持泛域名证书申请、按平台要求配置 DNS 验证、证书下载和自动续期。完成平台要求的初始验证配置并保持相关授权及解析有效后,平台可以执行后续验证与续期流程,减少人工重复申请的工作量。
需要注意的是,证书平台完成的是申请、验证、签发和续期相关环节,不能替代服务器部署检查。用户仍然需要完成初始验证配置,将新证书部署到 Web 服务器、反向代理、负载均衡或网关,并确认线上访问时返回的是新证书。
七、常见问题
1. 证书到期提醒提前多少天比较合适?
建议至少设置多个阈值,例如 30 天、14 天、7 天。30 天用于提前安排续期,14 天用于确认验证和部署条件,7 天用于紧急处理。对于变更流程较长的生产环境,还可以增加 60 天提醒。
2. 已经有自动续期,还需要到期监测吗?
仍然需要。自动续期只覆盖证书申请和续期流程,不代表新证书一定成功部署到所有节点。DNS 验证失效、部署脚本失败、服务未重载、负载均衡未更新,都可能导致线上仍然使用旧证书。
3. 泛域名证书是否会自动覆盖所有子域名?
不一定。泛域名证书通常只覆盖同一层级的通配子域名,例如 *.example.com 可覆盖 www.example.com、api.example.com,但不会自动覆盖 a.b.example.com 这类更深层级子域名,也不一定自动覆盖根域名 example.com。具体覆盖范围应以证书中的域名信息为准。
4. 内网 HTTPS 服务需要监测证书到期吗?
需要。只要业务依赖 HTTPS,内网服务证书过期同样会影响访问。内网服务可以使用内部 CA 或自签证书,监测工具可以检查到期时间,但浏览器信任情况需要单独处理。
5. 监测频率设置多高合适?
一般每天一次即可满足多数证书到期提醒需求。如果证书生命周期较短或环境变更频繁,可以缩短到每几小时一次。频率过高通常不会明显提升安全性,反而可能增加目标服务或网络负担。
八、总结
查询 SSL 证书到期时间可以先用浏览器或 openssl 确认单域名状态,再通过域名清单、脚本或监控系统实现批量检测和到期提醒。操作完成后,应验证每个域名都能返回真实线上证书、剩余天数计算正确,并且临期告警能实际送达。对于希望减少手动申请和重复续期的场景,可以结合证书管理平台处理申请与续期,但仍需完成初始验证、部署和线上生效检查。
需要申请或管理SSL证书?
前往七彩云证书平台,按提示完成域名验证,申请、查看和下载证书,并在保留验证解析及相关授权有效的前提下使用自动续期。服务器部署和线上生效仍需按实际环境配置与检查。
前往七彩云证书平台