是否可以通过传递域来检查证书链中涉及的证书的签发date和到期日?
我厌倦了各种openssl s_client属性,但我无法获得所需的信息。
需求:
通过一个域(和端口443一起),并在Linux中使用脚本或命令输出域(Web服务器)的证书链中涉及的颁发date和到期date。
答案是肯定的,你可以使用openssl ,你可以很容易地把它作为一个“检查”脚本包装起来,但是我不知道已经有这样的插件。
首先,caching服务器证书和整个链:
echo Q | openssl s_client -connect www.google.com:443 -showcerts > chain.pem
(这个链文件包含站点证书,中间链,以及其他垃圾 – 虽然openssl没有问题)
如果您只希望输出链文件中的每个证书的详细信息:
gawk 'BEGIN { pipe="openssl x509 -noout -subject -dates -serial "} \ /^-+BEGIN CERT/,/^-+END CERT/ { print | pipe } /^-+END CERT/ { close(pipe); printf("\n")} ' chain.pem
添加/省略-serial , -issuer , -fingerprint , -fingerprint为首选。 你甚至可以将它们连成一行(注意省略redirect和chain.pem事件):
echo Q | openssl ... | gawk ...
如果您希望正确validation链条,包括date范围,请继续阅读。
接下来,拉出网站(第一)证书,我会在这里使用sed ,因为我很懒;-)
sed -n '/-BEGIN/,/-END/p;/-END/q' chain.pem > site.pem
然后validation:
openssl verify -verbose -CAfile chain.pem site.pem
这是车轮脱落的地方:Google(正确)不提供链中的(自签名)根CA:
site.pem: /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA error 2 at 2 depth lookup:unable to get issuer certificate
所以, 从Geotrust中取出根证书 ,保存并设置一个合适的CA目录:
cd /usr/local/nagios/var/CA # example! wget http://www.geotrust.com/resources/root_certificates/certificates/Equifax_Secure_Certificate_Authority.pem c_rehash .
然后再试一次:
openssl verify -verbose -CAfile chain.pem -CApath /usr/local/nagios/var/CA site.pem
(注意额外的-CApath参数),你会得到:
site.pem: OK
现在坏消息, openssl不设置返回代码来表示成功,失败或任何有用的东西。 您将需要处理输出以确保一切正常,基本上除“OK”之外的其他任何行都表示出现问题。 您正在查找的过期证书将显示为:
error 10 at 2 depth lookup:certificate has expired
(深度可能会有所不同)。
注意和注意事项:
-CApath /some/path指向一个预先哈希的信任根的目录来解决这个问题。显示 chain.pem创build的chain.pem有额外的垃圾,这对openssl没有任何问题 我不知道有一个插件来检查问题date,但检查证书的有效期是check_http插件的一个标准function。
具体来说,请参阅-C选项。 如:
./check_http -H www.google.com -C 14 OK - Certificate 'www.google.com' will expire on 09/11/2014 11:04.
请注意,这将适用于任何使用SSL(LDAPS,IMAPS等),而不仅仅是HTTPS。
如果你想检查链中的证书,你可能想尝试类似check_ssl_cert的东西。 (我从来没有使用它,但使用信息看起来像它做你想要的。)