目录
- 为什么需要查看HTTPS证书信息
- 方法一:openssl直接查看证书详情(最全面)
- 方法二:curl -v 查看握手过程中的证书信息
- 方法三:curl查看证书有效期一键脚本
- 实战:批量检测多个域名证书到期时间
- 常见问题排查
为什么需要查看HTTPS证书信息
运维过程中,查看HTTPS证书信息是高频操作。常见场景包括:证书快到期了需要续期、排查HTTPS访问异常、确认证书是否覆盖了正确域名(SAN字段)、验证证书链是否完整。
很多人习惯点浏览器地址栏的小锁图标查看,但服务器端没有图形界面,必须靠命令行。curl配合openssl是最直接的方式,一条命令就能拿到证书的完整信息。
方法一:openssl直接查看证书详情(最全面)
openssl是查看证书信息最全面的工具,能拿到证书的所有字段,包括颁发机构、有效期、SAN(多域名)、签名算法等。
# 查看证书完整信息(文本格式)
echo | openssl s_client -connect www.youres.cn:443 2>/dev/null | openssl x509 -noout -text
# 只看有效期
echo | openssl s_client -connect www.youres.cn:443 2>/dev/null | openssl x509 -noout -dates
# 只看颁发机构(Issuer)
echo | openssl s_client -connect www.youres.cn:443 2>/dev/null | openssl x509 -noout -issuer
# 只看证书主题(Subject,即域名)
echo | openssl s_client -connect www.youres.cn:443 2>/dev/null | openssl x509 -noout -subject
# 查看SAN(证书覆盖的所有域名)
echo | openssl s_client -connect www.youres.cn:443 2>/dev/null | openssl x509 -noout -ext subjectAltName
# 查看证书序列号和指纹
echo | openssl s_client -connect www.youres.cn:443 2>/dev/null | openssl x509 -noout -serial -fingerprint
参数说明:
s_client -connect 域名:443:模拟TLS客户端连接,获取对端证书x509:x509证书处理子命令-noout:不输出证书本身(PEM编码),只输出指定字段-text:以可读文本格式输出完整证书内容-dates:只输出有效期(notBefore / notAfter)-subject:输出证书CN和DN信息-ext subjectAltName:输出SAN扩展,即证书绑定的所有域名/IP
输出示例(有效期):
notBefore=Jan 15 00:00:00 2024 GMT
notAfter=Jan 14 23:59:59 2025 GMT
方法二:curl -v 查看握手过程中的证书信息
curl的-v(verbose)模式会在SSL握手阶段打印证书信息,适合快速查看,不需要记住openssl的复杂参数。
# 查看证书基本信息(curl -v)
curl -v https://www.youres.cn 2>&1 | findstr /i "certificate subject expire issuer"
# Linux/macOS 下用 grep
curl -v https://www.youres.cn 2>&1 | grep -i "certificate\|subject\|expire\|issuer"
输出示例:
* Server certificate:
* subject: C=CN; ST=Beijing; L=Beijing; O=Youres; CN=www.youres.cn
* start date: Jan 15 00:00:00 2024 GMT
* expire date: Jan 14 23:59:59 2025 GMT
* issuer: C=US; O=Let's Encrypt; CN=R3
* SSL certificate verify ok.
优点:一条curl命令搞定,不需要额外安装openssl(Windows 10+和macOS/Linux都自带curl)
缺点:信息不如openssl全面,看不到SAN、证书链、签名算法等细节
方法三:curl查看证书有效期一键脚本
把openssl和curl组合起来,写一个一键脚本,直接输出证书还有多少天到期,非常适合做监控告警。
#!/bin/bash
# 查看证书到期剩余天数
domain="www.youres.cn"
port=443
echo | openssl s_client -connect "${domain}:${port}" 2>/dev/null \
| openssl x509 -noout -dates | grep notAfter \
| sed 's/notAfter=//'
# 计算剩余天数(需要GNU date)
expire_date=$(echo | openssl s_client -connect "${domain}:${port}" 2>/dev/null \
| openssl x509 -noout -enddate | sed 's/notAfter=//')
remaining_days=$(( $(date -d "${expire_date}" +%s) - $(date +%s) ))
remaining_days=$(( remaining_days / 86400 ))
echo "证书剩余天数: ${remaining_days} 天"
PowerShell版本(Windows)
# PowerShell 查看证书到期时间
$domain = "www.youres.cn"
$tcpClient = New-Object System.Net.Sockets.TcpClient
$tcpClient.Connect($domain, 443)
$tcpClient.Close()
# 使用 .NET 获取证书信息
$req = [System.Net.HttpWebRequest]::Create("https://$domain")
$req.GetResponse().Close()
# 更完善的方案是用 System.Security.Cryptography.X509Certificates
实战:批量检测多个域名证书到期时间
实际运维中经常需要一次性检查几十个域名的证书状态。下面是两个实用脚本。
Bash版:批量检查证书到期时间
#!/bin/bash
# 批量检查域名证书到期时间
domains=("example.com" "www.youres.cn" "github.com")
for domain in "${domains[@]}"; do
echo "=== $domain ==="
if timeout 5 bash -c "echo | openssl s_client -connect $domain:443 2>/dev/null \
| openssl x509 -noout -dates,subject"; then
echo "OK"
else
echo "连接失败或超时"
fi
echo ""
done
PowerShell版:批量检查(Windows服务器首选)
# PowerShell 批量检查HTTPS证书到期时间
$domains = @("www.youres.cn", "example.com", "github.com")
foreach ($domain in $domains) {
Write-Host "=== $domain ===" -ForegroundColor Cyan
try {
$tcp = New-Object System.Net.Sockets.TcpClient($domain, 443)
$tcp.Close()
# 用curl获取证书信息
$output = curl -v "https://$domain" 2>&1
($output | Select-String "expire date").ToString()
} catch {
Write-Host "连接失败: $_" -ForegroundColor Red
}
Write-Host ""
}
常见问题排查
1. curl: (60) SSL certificate problem: certificate has expired
原因:证书已过期,或者服务器系统时间不正确,或者系统CA证书包太旧无法验证新证书。
解决:确认证书确实过期则去续期;如果是CA包太旧,更新CA证书:
# Debian/Ubuntu
sudo apt update && sudo apt install -y ca-certificates
# CentOS/RHEL
sudo yum install -y ca-certificates
# Alpine
apk add --no-cache ca-certificates
2. 如何确认证书是否包含www和不带www两个域名?
查看证书的SAN扩展字段:
echo | openssl s_client -connect www.youres.cn:443 2>/dev/null \
| openssl x509 -noout -ext subjectAltName
输出示例:DNS:www.youres.cn, DNS:youres.cn — 两个都有说明配置正确。
3. curl忽略证书错误后如何恢复默认安全行为?
只需要去掉-k或--insecure参数即可恢复。这个参数的原理是跳过证书验证,生产过程严禁使用。详见:curl忽略SSL证书错误参数详解。
4. 自签名证书怎么让curl信任?
用--cacert参数指定自签名CA证书路径:
curl --cacert /path/to/ca.crt https://internal-site.local
5. 如何查看证书链是否完整?
# 显示完整证书链(包括中间证书)
echo | openssl s_client -connect www.youres.cn:443 -showcerts 2>/dev/null \
| grep -E "s:|i:|subject=|issuer="
总结
查看HTTPS证书信息,最推荐的组合是openssl s_client + openssl x509,信息最全。如果只想快速确认有效期,用curl -v更高效。生产环境建议把证书到期检查写入定时任务,提前告警,避免证书过期导致网站无法访问。
相关阅读:
版权声明
本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论