我有多个 SSL 证书,并且希望在证书过期时收到通知。
我的想法是创建一个 cronjob,每天执行一个简单的命令。
我知道openssl
Linux中的命令可用于显示远程服务器的证书信息,即:
openssl s_client -connect www.google.com:443
但我在此输出中没有看到到期日期。另外,我必须用CTRL+终止此命令c。
如何从脚本(最好使用openssl
)检查远程证书的到期时间并以“批处理模式”执行,以便它自动运行而无需用户交互?
答案1
您的命令现在需要一个 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秒内过期
答案2
它确实为您提供了证书,但不会对其进行解码。因为如果您想要日期就需要它,所以您看不到它。因此,需要将其通过管道传输到 OpenSSL 的x509
应用程序中以解码证书:
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