SSL 证书检查:网站 HTTPS 的“体检报告”,过期前再也不用手忙脚乱
SSL 证书检查网站 HTTPS 的“体检报告”过期前再也不用手忙脚乱去年公司官网突然在某个周五下午被用户投诉“打不开浏览器提示不安全”。我登录服务器一看原来是 SSL 证书过期了而邮件提醒被扔进了垃圾箱。从那以后我写了一个 SSL 证书检查工具定期扫一遍所有域名提前 30 天报警。这篇文章分享这个工具怎么用、证书的关键字段怎么看以及如何用代码自己实现一个检查脚本。 工具SSL 证书检查一、这个工具能做什么SSL 证书检查工具用于获取网站 SSL/TLS 证书的详细信息帮助诊断 HTTPS 配置问题。查看证书基本信息颁发者CA、有效期起止时间、剩余天数。检查是否过期自动判断当前时间是否在有效期内。显示主题备用名称SAN证书支持的所有域名包括泛域名如*.google.com。快速诊断适用于网站 HTTPS 报错、证书续期前确认等场景。适用场景用户反馈“网站不安全”检查证书是否过期或域名不匹配。购买新证书后确认是否正确安装。定期巡检自己名下所有域名的证书有效期避免意外中断。二、如何使用2.1 在线工具推荐打开 上述 [ssl证书检查]输入域名例如 “www.google.com”不要带http://或https://。点击「检查证书」按钮。结果会显示颁发者Issuer有效期起始与结束剩余天数若为负数则已过期主题Subject主题备用名称SAN签名算法注意仅支持 HTTPS 协议的域名端口 443。自签名证书或非标准端口可能无法获取。2.2 命令行方式OpenSSL如果你习惯命令行可以快速检查证书# 获取证书并解析openssl s_client-connectwww.google.com:443-servernamewww.google.com2/dev/null|openssl x509-text-noout输出中包含 Validity有效期、Subject、X509v3 Subject Alternative Name 等信息。只查看过期时间更简洁echo|openssl s_client-connectwww.google.com:443-servernamewww.google.com2/dev/null|openssl x509-noout-dates三、证书关键字段解释字段含义示例颁发者 (Issuer)证书由哪个 CA 机构签发CNDigiCert TLS RSA SHA256 2020 CA1, ODigiCert Inc有效期 (Validity)起止时间UTC 格式notBeforeApr 10 00:00:00 2025 GMT, notAfterApr 11 23:59:59 2026 GMT剩余天数计算当前时间与 notAfter 的差值如还有 180 天过期主题 (Subject)证书绑定的主要域名CNwww.google.comSAN (Subject Alternative Name)证书支持的其他域名含泛域名DNS:*.google.com, DNS:google.com, DNS:www.google.com签名算法加密签名算法sha256WithRSAEncryption⚠️ 关键点如果用户访问的域名不在 Subject 或 SAN 列表中浏览器会报“证书不安全”。例如证书只签发给了 [www.example.com]但用户访问 api.example.com就会报错。四、技术实现如何获取证书信息工具的后端使用了 Node.js 的 tls 模块核心代码如下const tls require(tls); const { promisify } require(util); async function getCertificate(hostname, port 443) { return new Promise((resolve, reject) { const socket tls.connect({ host: hostname, port: port, servername: hostname, // SNI 支持 rejectUnauthorized: false // 即使证书无效也获取信息 }, () { const cert socket.getPeerCertificate(); socket.end(); resolve(cert); }); socket.on(error, reject); }); }获取到的 cert 对象包含 issuer、subject、valid_from、valid_to 等属性。然后计算剩余天数并格式化输出。工具本身不存储任何域名或证书数据每次请求实时获取。五、实战场景与排障场景1证书过期导致网站打不开现象浏览器访问显示 NET::ERR_CERT_DATE_INVALID。用工具检查输入域名发现剩余天数为负数。解决办法立刻续签证书。建议设置自动续期如 Let’s Encrypt 的 certbot 配合 cron。场景2配置了新的证书但浏览器仍报不安全现象 已经替换了证书但访问时还是旧证书的信息。可能原因浏览器缓存清除缓存或开无痕窗口。服务器配置错误没有正确加载新证书比如 Nginx 配置文件指向旧文件。中间负载均衡器/ CDN 没有刷新。用工具检查工具显示的是实时获取的证书如果工具显示正确但浏览器显示错误大概率是浏览器缓存。如果工具也显示旧证书那就是服务器没配好。场景3证书域名不匹配现象证书是 *.example.com但访问 example.com不带 www时报错。用工具检查查看 SAN 字段确认是否包含 example.com。如果只有 *.example.com 和 www.example.com则 example.com 不在列表中需要重新签发或添加。场景4自签名证书用于测试内网环境常用自签名证书浏览器会报不安全。工具也可以检查自签名证书只要连接成功。但需要注意 rejectUnauthorized: false 选项。六、踩坑汇总真实遇到过输入带 http:// 或 https:// 导致失败工具期望的是纯域名比如 www.google.com。输入 https://www.google.com 会被当成包含协议部分的无效域名。所以请只输入域名。某些 CDN 或反向代理隐藏了真实证书现象你检查 www.example.com工具返回的证书是 CDN 厂商的而不是你自己服务器的。解释如果域名通过 CDN如 CloudflareTCP 连接终止在 CDN 节点获取的是 CDN 的边缘证书。这是正常的因为用户实际也是与 CDN 通信。证书有效但提示“无法连接到服务器”原因域名没有开放 443 端口或者防火墙拦截。解决先 ping 或 telnet domain 443 确认端口可达。泛域名证书的 SAN 显示 *.example.com这代表该证书可以匹配任意子域名如 mail.example.com、blog.example.com但不能匹配 example.com 本身没有点。如果需要匹配裸域名SAN 必须显式包含 example.com。剩余天数计算时区问题证书有效期存储的是 UTC 时间。工具在计算剩余天数时会转换为本地时区后再比较避免误判。但如果你临近午夜23:59检查可能会相差一天这是正常的。七、自动化巡检脚本基于 Node.js创建一个脚本定期检查多个域名的证书剩余天数提前告警const https require(https); function checkSSL(hostname) { return new Promise((resolve) { const options { hostname, port: 443, method: HEAD, rejectUnauthorized: false }; const req https.request(options, (res) { const cert res.socket.getPeerCertificate(); if (!cert || !cert.valid_to) { resolve({ hostname, error: 无法获取证书 }); return; } const expiryDate new Date(cert.valid_to); const daysLeft Math.floor((expiryDate - Date.now()) / (1000 * 3600 * 24)); resolve({ hostname, issuer: cert.issuer.CN, daysLeft, valid_to: cert.valid_to }); }); req.on(error, (err) resolve({ hostname, error: err.message })); req.end(); }); } // 批量检查 const domains [google.com, github.com, your-own-domain.com]; Promise.all(domains.map(d checkSSL(d))).then(results { results.forEach(r { if (r.error) console.error(${r.hostname}: ${r.error}); else if (r.daysLeft 30) console.warn(⚠️ ${r.hostname} 证书将在 ${r.daysLeft} 天后过期); else console.log(✅ ${r.hostname} 证书有效剩余 ${r.daysLeft} 天); }); });可以将此脚本放入 cronLinux或任务计划Windows每天运行一次邮件通知管理员。八、总结SSL 证书检查是网站运维的“体温计”定期测量才能避免证书过期导致的业务中断。VidDown 的在线工具免安装、免配置适合临时检查而命令行和脚本则适合批量自动化监控。版权声明本文为 VidDown 原创欢迎分享请保留出处。