检查SSL证书是否有效的脚本


14

我有几个SSL证书,并且证书过期后想通知我。

我的想法是创建一个cronjob,每天执行一个简单的命令。

我知道opensslLinux 中的命令可用于显示远程服务器的证书信息,即:

openssl s_client -connect www.google.com:443

但我在此输出中看不到到期日期。另外,我必须用CTRL+ 终止此命令c

如何从脚本(最好使用openssl)中检查远程证书的到期时间,并在“批处理模式”下进行操作,以使其自动运行而无需用户干预?


4
我建议也-servername www.google.com为启用了SNI的服务器发送服务器名,以避免终止的需要,将/ dev / null发送给它< /dev/null
syss

如果您正在运行Red Hat / CentOS / Fedora,请查看certmonger。也可以从标准存储库中获得。
JRFerguson 2015年

我会将证书检查添加到nagios或icinga等监视工具中。
sebix

Answers:


18

您的命令现在将期望一个http请求GET index.php,例如。使用此代替:

if true | openssl s_client -connect www.google.com:443 2>/dev/null | \
  openssl x509 -noout -checkend 0; then
  echo "Certificate is not expired"
else
  echo "Certificate is expired"
fi

  • true:只会在eof之后不提供任何输入,因此openssl在连接后退出。
    • openssl ...:您问题中的命令
    • 2>/dev/null:错误输出将被忽略。
  • openssl x509:激活X.509证书数据管理。
    • 默认情况下,这将从标准输入中读取
    • -noout:禁止整个证书输出
    • -checkend 0:检查证书是否在接下来的0秒内过期

-checkend比我发现执行日期算术的脚本容易得多!
Auspex

7

它确实会为您获取证书,但不会对其进行解码。因为如果需要日期,则需要该日期,因此看不到它。因此,需要将其通过管道x509传输到OpenSSL的应用程序中以对证书进行解码:

openssl s_client -connect www.example.com:443 \
    -servername www.example.com </dev/null |\
    openssl x509 -in /dev/stdin -noout -text

这将为您提供标准输出上的完整解码证书,包括其有效日期。


3

如果您需要检查到期日期,请感谢此博客文章,找到了一种方法,可以通过一次调用找到该信息以及其他相关信息:

echo | openssl s_client -servername unix.stackexchange.com -connect unix.stackexchange.com:443 2>/dev/null | openssl x509 -noout -issuer -subject -dates

输出包括签发人,主题(向其签发证书的人),签发日期以及最后的到期日期

issuer= /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert SHA2 High Assurance Server CA
subject= /C=US/ST=NY/L=New York/O=Stack Exchange, Inc./CN=*.stackexchange.com
notBefore=May 21 00:00:00 2016 GMT
notAfter=Aug 14 12:00:00 2019 GMT
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.