为什么要主动检测HTTPS证书有效期?
HTTPS证书过期是导致网站无法访问的常见原因之一,浏览器会直接拦截并提示「您的连接不是私密连接」,不仅影响用户体验,还会被搜索引擎判定为不安全站点,直接影响SEO排名。对于运维人员来说,尤其是管理多个域名的场景,掌握快速检测证书有效期的方法,能提前排查风险,避免证书过期导致的线上故障。
方法1:基础版curl命令(Linux/macOS原生curl)
对于Linux、macOS等原生带curl的系统,最简单的方法是用-v参数查看详细握手信息,过滤出证书到期时间:
curl -v https://www.youres.cn 2>&1 | grep "expire"
参数说明:
-v:输出完整的请求响应过程,包含SSL握手阶段的证书信息2>&1:将错误输出(STDERR)重定向到标准输出(STDOUT),避免过滤不到信息grep "expire":过滤包含expire的行,直接定位证书到期时间
示例输出:
* expire date: 2027-05-25 12:00:00 GMT
输出中的日期就是当前域名的HTTPS证书到期时间。
方法2:精准获取证书到期时间(过滤无用信息)
基础版命令会输出很多无用信息,如果需要只获取到期时间,适合脚本调用的简洁版本,可以用下面的命令:
curl -v --silent https://www.youres.cn 2>&1 | grep -i "expire date" | cut -d: -f2-
参数说明:
--silent:不显示进度条、请求耗时等无用信息,输出更干净-i:grep忽略大小写,避免因为大小写问题过滤不到cut -d: -f2-:以冒号为分隔符,截取第二部分及之后的内容,直接输出到期时间
示例输出:
2027-05-25 12:00:00 GMT
方法3:获取证书完整信息(含颁发者、序列号)
如果需要排查证书的颁发者、序列号、签名算法等完整信息,可以用下面的命令,输出SSL证书相关的所有内容:
curl -v --silent https://www.youres.cn 2>&1 | grep -A 30 "SSL certificate"
参数说明:-A 30表示显示匹配到SSL certificate的行之后的30行内容,基本覆盖证书的所有信息。
如果需要保存完整信息到本地文件,方便后续排查,可以用重定向:
curl -v https://www.youres.cn > cert_info.txt 2>&1
Windows用户适配:PowerShell的替代方案
很多Windows用户会发现直接运行上面的curl命令报错,原因是Windows PowerShell中的curl是Invoke-WebRequest的别名,并非原生curl,所以需要用两种方案解决:
方案1:安装原生curl
- Windows 10 21H2及以上版本:在「设置-应用-可选功能」中搜索「curl」,安装后即可使用原生curl命令
- 用包管理器安装:Chocolatey用户执行
choco install curl -y,Scoop用户执行scoop install curl
方案2:用PowerShell原生命令替代
如果不想安装原生curl,可以用PowerShell自带的Invoke-WebRequest命令获取证书到期时间,命令如下:
(Invoke-WebRequest -Uri https://www.youres.cn -UseBasicParsing).Certificate.ExpiryDate
参数说明:-UseBasicParsing避免调用IE引擎解析HTML,提升执行速度,同时避免权限问题。
如果需要批量检测多个域名的证书到期时间,可以用下面的PowerShell脚本:
= @("www.youres.cn", "blog.youres.cn")
foreach ( in ) {
try {
= (Invoke-WebRequest -Uri "https://" -UseBasicParsing -TimeoutSec 10).Certificate
Write-Host " 证书到期时间: "
} catch {
Write-Host " 检测失败: " -ForegroundColor Red
}
}
批量检测多个域名证书有效期(Shell脚本)
对于Linux服务器运维人员,如果需要批量检测几十上百个域名的证书到期时间,可以用下面的bash脚本,配合域名列表文件实现一键检测:
#!/bin/bash
# 域名列表文件,每行一个域名
DOMAIN_FILE="domains.txt"
# 告警阈值:证书到期时间小于30天则告警
ALERT_DAYS=30
while read -r domain; do
# 跳过空行
[[ -z "" ]] && continue
# 获取证书到期时间
expire_date=
if [[ -z "" ]]; then
echo "[ERROR] 获取证书信息失败"
continue
fi
# 计算剩余天数(需要系统支持date命令解析日期)
expire_timestamp=
current_timestamp=
remain_days=
echo " 证书到期时间: ,剩余天数: "
# 告警提示
if [[ -lt ]]; then
echo "[ALERT] 证书剩余天数小于 天,请及时续期!" | mail -s " 证书即将过期" admin@youres.cn
fi
done < ""
使用方法:新建domains.txt文件,每行写一个需要检测的域名,然后运行脚本即可。
常见问题排查
- 执行命令后没有expire相关输出?可能是curl版本太旧,不支持显示证书信息,升级curl到最新版即可;也可能是网站使用的是TLS 1.3,需要添加
--tlsv1.3参数强制使用TLS 1.3握手。 - Windows下curl命令报错「不是内部或外部命令」?说明没有安装原生curl,按照上面的方案1安装即可,或者使用PowerShell的替代命令。
- 获取的证书到期时间和实际不符?可能是服务器时间不正确,或者使用的是通配符证书,需要确认域名是否和证书的SAN(主题备用名称)匹配。
相关阅读
版权声明
本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论