SSL 证书问题是网站可能遇到的最具破坏性的技术问题之一。过期的证书会通过浏览器警告将每个访问者锁定。错误配置的证书会导致静默失败。颁发给错误域的证书会破坏子域。与大多数问题不同的是,证书问题是按计划发生的——它们会过期——所以如果你知道去哪里寻找,它们是完全可以预防的。
以下是如何检查任何 SSL 证书、每个字段的含义以及出现错误时该怎么做。
快速检查:您的浏览器
对于您访问的任何网站,最快的 SSL 检查就在您的浏览器中。
铬/边缘: 单击 URL 旁边的锁图标(或“连接安全”文本) → 证书有效 → 证书详细信息
火狐浏览器: 单击锁图标 → 连接安全 → 更多信息 → 查看证书
这向您展示:
- 证书颁发给谁(域)
- 谁颁发的(证书颁发机构)
- 有效期自 / 有效期至日期
- 证书序列号和指纹
对于快速健全性检查 - 该证书是否有效,它是否属于正确的域 - 浏览器 UI 就是您所需要的。
彻底检查:在线工具
要对证书进行完整分析,包括密码套件、链有效性、HSTS 配置和已知漏洞,请使用 SSL 检查工具。输入任何域,它都会运行完整的分析,无需安装任何东西。
这对于以下情况特别有用:
- 无法直接访问的服务器上的证书
- 安装后验证新证书
- 在证书即将过期之前检查证书
- 审核密码套件强度(应禁用 TLS 1.0/1.1)
命令行:openssl
对于开发人员和系统管理员来说, openssl 为您提供从终端直接进行证书检查。
检查远程服务器的证书:
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null | openssl x509 -noout -text
这将返回完整的证书详细信息。要查看的关键字段:
有效期:
openssl s_client -connect example.com:443 -servername example.name </dev/null 2>/dev/null | openssl x509 -noout -dates
输出:
notBefore=Jan 1 00:00:00 2025 GMT
notAfter=Jan 1 00:00:00 2026 GMT
查看本地证书文件:
openssl x509 -in certificate.crt -noout -text
openssl x509 -in certificate.crt -noout -dates
openssl x509 -in certificate.crt -noout -subject -issuer
验证证书链:
openssl verify -CAfile chain.pem certificate.crt
检查过期天数(可编写脚本):
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2 | xargs -I{} date -d {} +%s | xargs -I{} expr \( {} - $(date +%s) \) / 86400
返回剩余天数。在监视脚本中很有用。
每个证书字段的含义
主题/通用名称(CN): 颁发证书的域名。必须与您正在访问的域匹配,否则浏览器将显示警告。对于通配符证书,这是 *.example.com.
主题备用名称 (SAN): 证书涵盖的所有域的列表。现代证书使用 SAN 而不仅仅是 CN。证书可能涵盖 example.com, www.example.com,和 api.example.com — 全部列在这里。这就是浏览器实际检查的内容。
发行人: 签署证书的证书颁发机构 (CA)。常见的有:Let's Encrypt、DigiCert、Sectigo、Google Trust Services、Amazon。颁发者自己的证书由浏览器信任的根 CA 签名。
有效期: 不在日期之前和之后。证书过期 — Let's Encrypt 证书每 90 天过期(自动续订)。商业证书的有效期通常为 1 年。
关键算法和大小: RSA 2048 位为最低; 4096 位或 EC P-256 更强。 EC(椭圆曲线)证书以较小的密钥大小提供同等的安全性,从而略微提高了性能。
TLS 版本: 您的服务器应支持 TLS 1.2 和 TLS 1.3。 TLS 1.0 和 1.1 已弃用,应禁用 — 现代浏览器拒绝这些连接。
证书透明度: 现代证书记录在公共证书透明度日志中。这对于 Chrome 信任的证书是强制性的。它允许任何人审核为某个域颁发了哪些证书——对于检测未经授权的证书很有用。
常见 SSL 问题及其解决方法
证书过期 最常见的问题。您的浏览器显示“您的连接不是私人连接”并出现错误 NET::ERR_CERT_DATE_INVALID.
修复:更新证书。如果您使用 Let's Encrypt with Certbot,请运行 certbot renew。如果使用付费证书,请通过您的 CA 购买续订并安装它。设置监控以在到期前 30 天提醒您,这样在生产中就不会发生这种情况。
证书域名不匹配 证书颁发给 example.com 但你正在访问
视野中发现 www.example.com (或反之亦然),并且证书不包含另一个作为 SAN。
修复:要么获取涵盖两者的证书(大多数证书都应该),要么一致地将一个证书重定向到另一个证书。
证书链不完整 您的服务器正在提供您的证书,但不提供将其连接到受信任根 CA 的中间证书。缓存了中间内容的浏览器可以连接;其他人看到错误。
修复:配置您的网络服务器以发送完整链。对于 Nginx,使用 ssl_certificate 指向包含您的证书和中间包的文件。对于阿帕奇,使用 SSLCertificateChainFile.
专门检查这个问题:
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null | grep -A 1 "Certificate chain"
您应该在链中看到至少 2 个证书(您的证书 + 中间证书)。
自签名证书 浏览器不信任未经认可的 CA 签名的证书。自签名证书适合内部开发,但会对任何面向公众的网站触发警告。
修复:从受信任的 CA 获取证书。 Let's Encrypt 对于公共领域是免费且自动化的。
弱密码套件 The server negotiates a TLS connection using outdated or weak algorithms (RC4, DES, export-grade ciphers, TLS 1.0/1.1).
检查:
nmap --script ssl-enum-ciphers -p 443 example.com
修复:仅将 Web 服务器的 SSL 配置更新为现代密码套件。莫斯拉的 SSL 配置生成器 为 Nginx、Apache 等生成可立即粘贴的配置。
证书监控
在证书过期之前手动检查证书无法扩展。自动监控选项:
Certbot 自动续订: 如果您使用 Let's Encrypt,Certbot 会设置一个 cron 作业或 systemd 计时器,在证书剩余时间少于 30 天时自动续订证书。验证它是否正常工作: certbot renew --dry-run
正常运行时间监控服务: 大多数正常运行时间监视器(UptimeRobot、Freshping、Better Uptime)都包含证书到期警报。设置 30 天的警告阈值。
cron 中的自定义脚本: 一个简单的 bash 脚本,使用 openssl 命令可以检查过期时间并发送电子邮件警报。
上面的
#!/bin/bash
DOMAIN="example.com"
DAYS_LEFT=$(echo | openssl s_client -connect $DOMAIN:443 -servername $DOMAIN 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2 | xargs -I{} python3 -c "from datetime import datetime; print((datetime.strptime('{}', '%b %d %H:%M:%S %Y %Z') - datetime.utcnow()).days)")
if [ "$DAYS_LEFT" -lt 30 ]; then
echo "Certificate for $DOMAIN expires in $DAYS_LEFT days" | mail -s "SSL Warning" admin@example.com
fi
底线
证书问题是可以预测和预防的。主要的问题——过期、域名不匹配、不完整的链——都在 SSL 检查中清楚地显示出来。
使用以下命令对任何域运行检查 SSL 检查工具。对于生产服务器,设置至少 30 天警报窗口的到期监控。如果您仍在使用 TLS 1.0 或 1.1,请禁用它们 - 任何现代服务器都应该仅使用 TLS 1.2+。