如何在命令行里快速方便地查看网站 SSL 证书有效期?

一句话命令:

echo | openssl s_client -servername $NAME -connect "$host":443 2>/dev/null | openssl x509 -noout -dates

$NAME$host 都是域名,确切地说,$NAME 是 SSL 握手时 SNI 里面的名字,$host 则代表被解析的域名,是一个地址。通常这两个变量的值是相同的一个域名。

如果 a.example.com 和 b.aaaa.com 都解析到 1.2.3.4,那么想检查哪个域名的 SSL 证书,$NAME 就是哪个域名,而 $host 可以是 a.example.com,也可以是 b.aaaa.com,当然也可以是 IP 地址 1.2.3.4。

例子:

$ echo | openssl s_client -servername ifttl.com -connect "ifttl.com":443 2>/dev/null | openssl x509 -noout -dates
notBefore=Sep  3 13:11:07 2019 GMT
notAfter=Sep  3 13:11:07 2020 GMT

2020 年 9 月 3 号过期。


一些废话

Letsencrypt 每次签的免费证书只有三个月有效期,固然能够通过 crontab 跑脚本自动续期,但是各个环节也都有可能出问题,再加上维护的域名数量一多,续期失败的概率就不容小觑。还是需要把证书的有效期监控起来,以免证书过期,网站打不开。

查看网站证书有效期最笨的办法是用浏览器打开网站,然后在浏览器里查看证书信息。

SSLPod 看上去是个可以很好的解决方案,能够帮你监控 SSL 证书有效期,还包含了告警等多项功能。

证书监控(SSLPod)是一款集多个 HTTPS 站点安全检测、证书有效期管理以及异常告警等功能于一体的系统。它提供了可视化评级图表和可交互的跨品牌证书管理仪表盘,支持 HTTPS 安全评级,证书品牌、证书有效期、SSL 漏洞、PCI DSS & ATS 合规监控和集中管理;还能够及时地将异常情况通过邮件、微信、短信进行告警通知,并根据评测结果,给出改造建议。

不过,我还是需要一个更简单,更方便地看到证书过期时间的办法。