SSL 证书检查:网站 HTTPS 的“体检报告”,过期前再也不用手忙脚乱
去年公司官网突然在某个周五下午被用户投诉“打不开,浏览器提示不安全”。我登录服务器一看,原来是 SSL 证书过期了,而邮件提醒被扔进了垃圾箱。从那以后,我写了一个 SSL 证书检查工具,定期扫一遍所有域名,提前 30 天报警。这篇文章分享这个工具怎么用、证书的关键字段怎么看,以及如何用代码自己实现一个检查脚本。
本文工具由 VidDown 提供 —— 一个目前免费、无需登录、纯前端处理的在线工具集。除了 SSL 检查,还提供视频解析、JSON 格式化、API 测试等 20+ 实用功能。
🔧 本文专属工具:SSL 证书检查
一、这个工具能做什么?
SSL 证书检查工具用于获取网站 SSL/TLS 证书的详细信息,帮助诊断 HTTPS 配置问题。
- 查看证书基本信息:颁发者(CA)、有效期(起止时间)、剩余天数。
- 检查是否过期:自动判断当前时间是否在有效期内。
- 显示主题备用名称(SAN):证书支持的所有域名,包括泛域名(如
*.google.com)。 - 快速诊断:适用于网站 HTTPS 报错、证书续期前确认等场景。
适用场景:
- 用户反馈“网站不安全”,检查证书是否过期或域名不匹配。
- 购买新证书后,确认是否正确安装。
- 定期巡检自己名下所有域名的证书有效期,避免意外中断。
二、如何使用?
2.1 在线工具(推荐)
- 打开 https://viddown.cn/tools/ssl-checker/
- 输入域名,例如
www.google.com(不要带http://或https://)。 - 点击「检查证书」按钮。
- 结果会显示:
- 颁发者(Issuer)
- 有效期起始与结束
- 剩余天数(若为负数则已过期)
- 主题(Subject)
- 主题备用名称(SAN)
- 签名算法
💡 注意:仅支持 HTTPS 协议的域名(端口 443)。自签名证书或非标准端口可能无法获取。
2.2 命令行方式(OpenSSL)
如果你习惯命令行,可以快速检查证书:
# 获取证书并解析
openssl s_client -connect www.google.com:443 -servername www.google.com 2>/dev/null | openssl x509 -text -noout
输出中包含 Validity(有效期)、Subject、X509v3 Subject Alternative Name 等信息。
只查看过期时间(更简洁):
echo | openssl s_client -connect www.google.com:443 -servername www.google.com 2>/dev/null | openssl x509 -noout -dates
三、证书关键字段解释
| 字段 | 含义 | 示例 |
|---|---|---|
| 颁发者 (Issuer) | 证书由哪个 CA 机构签发 | CN=DigiCert TLS RSA SHA256 2020 CA1, O=DigiCert Inc |
| 有效期 (Validity) | 起止时间,UTC 格式 | notBefore=Apr 10 00:00:00 2025 GMT, notAfter=Apr 11 23:59:59 2026 GMT |
| 剩余天数 | 计算当前时间与 notAfter 的差值 | 如还有 180 天过期 |
| 主题 (Subject) | 证书绑定的主要域名 | CN=www.google.com |
| SAN (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(如 Cloudflare),TCP 连接终止在 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} 天`);
});
});
可以将此脚本放入 cron(Linux)或任务计划(Windows),每天运行一次,邮件通知管理员。
八、总结
SSL 证书检查是网站运维的“体温计”,定期测量,才能避免证书过期导致的业务中断。VidDown 的在线工具免安装、免配置,适合临时检查;而命令行和脚本则适合批量自动化监控。
如果你还没试过,现在就去 https://viddown.cn/tools/ssl-checker/ 检查一下你的网站证书吧。
关于 VidDown
VidDown 还提供随机数据生成、REST API 测试、JSON 格式化、PDF 合并等 20+ 工具。所有工具目前免费,大部分纯前端本地处理。
🔗 主站:https://viddown.cn
版权声明:本文为 VidDown 原创,欢迎分享,请保留出处。