提示

SSL 证书检查:网站 HTTPS 的“体检报告”,过期前再也不用手忙脚乱

SSL 证书检查:网站 HTTPS 的“体检报告”,过期前再也不用手忙脚乱

去年公司官网突然在某个周五下午被用户投诉“打不开,浏览器提示不安全”。我登录服务器一看,原来是 SSL 证书过期了,而邮件提醒被扔进了垃圾箱。从那以后,我写了一个 SSL 证书检查工具,定期扫一遍所有域名,提前 30 天报警。这篇文章分享这个工具怎么用、证书的关键字段怎么看,以及如何用代码自己实现一个检查脚本。

本文工具由 VidDown 提供 —— 一个目前免费、无需登录、纯前端处理的在线工具集。除了 SSL 检查,还提供视频解析、JSON 格式化、API 测试等 20+ 实用功能。
🔧 本文专属工具:SSL 证书检查

一、这个工具能做什么?

SSL 证书检查工具用于获取网站 SSL/TLS 证书的详细信息,帮助诊断 HTTPS 配置问题。

  • 查看证书基本信息:颁发者(CA)、有效期(起止时间)、剩余天数。
  • 检查是否过期:自动判断当前时间是否在有效期内。
  • 显示主题备用名称(SAN):证书支持的所有域名,包括泛域名(如 *.google.com)。
  • 快速诊断:适用于网站 HTTPS 报错、证书续期前确认等场景。

适用场景:
- 用户反馈“网站不安全”,检查证书是否过期或域名不匹配。
- 购买新证书后,确认是否正确安装。
- 定期巡检自己名下所有域名的证书有效期,避免意外中断。

二、如何使用?

2.1 在线工具(推荐)

  1. 打开 https://viddown.cn/tools/ssl-checker/
  2. 输入域名,例如 www.google.com不要带 http://https://)。
  3. 点击「检查证书」按钮。
  4. 结果会显示:
  5. 颁发者(Issuer)
  6. 有效期起始与结束
  7. 剩余天数(若为负数则已过期)
  8. 主题(Subject)
  9. 主题备用名称(SAN)
  10. 签名算法

💡 注意:仅支持 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 选项。

六、踩坑汇总(真实遇到过)

  1. 输入带 http:// 或 https:// 导致失败
    工具期望的是纯域名,比如 www.google.com。输入 https://www.google.com 会被当成包含协议部分的无效域名。所以请只输入域名。

  2. 某些 CDN 或反向代理隐藏了真实证书
    现象:你检查 www.example.com,工具返回的证书是 CDN 厂商的,而不是你自己服务器的。
    解释:如果域名通过 CDN(如 Cloudflare),TCP 连接终止在 CDN 节点,获取的是 CDN 的边缘证书。这是正常的,因为用户实际也是与 CDN 通信。

  3. 证书有效但提示“无法连接到服务器”
    原因:域名没有开放 443 端口,或者防火墙拦截。
    解决:先 ping 或 telnet domain 443 确认端口可达。

  4. 泛域名证书的 SAN 显示 *.example.com
    这代表该证书可以匹配任意子域名(如 mail.example.com、blog.example.com),但不能匹配 example.com 本身(没有点)。如果需要匹配裸域名,SAN 必须显式包含 example.com。

  5. 剩余天数计算时区问题
    证书有效期存储的是 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 原创,欢迎分享,请保留出处。

顶部
×
🔖
收藏本站
将本站添加到浏览器书签,方便下次访问
Ctrl + D (Windows/Linux)
+ D (Mac)