![检查涉及证书链的证书的颁发日期和到期日期](https://linux22.com/image/804431/%E6%A3%80%E6%9F%A5%E6%B6%89%E5%8F%8A%E8%AF%81%E4%B9%A6%E9%93%BE%E7%9A%84%E8%AF%81%E4%B9%A6%E7%9A%84%E9%A2%81%E5%8F%91%E6%97%A5%E6%9C%9F%E5%92%8C%E5%88%B0%E6%9C%9F%E6%97%A5%E6%9C%9F.png)
是否仅通过传递域名就可以检查证书链中涉及的证书的颁发日期和到期日期?
我尝试了各种 openssl s_client 属性,但无法获取所需的信息。
要求:
传递一个域(以及端口 443),并使用 Linux 中的脚本或命令输出该域(Web 服务器)的证书链中涉及的颁发日期和到期日期。
答案1
答案是肯定的,您可以使用来做到这一点openssl
,您可以轻松地将其包装为“检查”脚本,但我不知道有插件已经可以做到这一点。
首先,缓存服务器证书和中间链:
echo Q | openssl s_client \
-connect www.google.com:443 -servername www.google.com -showcerts > chain.pem
(该链文件包含站点证书,以及中间链以及其他垃圾)
你应该也使用-servername www.google.com
,以便启用 SNI 的站点返回预期的证书。如果您只希望输出链文件中每个证书的详细信息:
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
。您甚至可以将两个步骤粘合为一行(注意省略重定向和出现):-purpose
openssl
chain.pem
echo Q | openssl ... | gawk ...
如果您希望正确验证链,包括日期范围,请继续阅读。
接下来,只提取站点(第一个)证书,我将sed
在这里使用它,因为我很懒 ;-)
sed -n '/-BEGIN/,/-END/p;/-END/q' chain.pem > site.pem
然后验证:
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
指向受信任的根证书(预散列)目录来解决这个问题,如上所示 - 这不会捕获链文件的错误排序,也不会捕获链文件中多余的证书(这通常都不是浏览器的问题,但站点验证器通常会标记它们 - 至少这些会不必要地扰乱 HTTPS 握手)
- 服务器不需要提供整个链,特别是对于较长的链,在这种情况下,还需要将它们添加到 CApath 目录中
- 此处创建
chain.pem
的内容包含多余的文本垃圾,但这对于openssl
- 每个非根证书将通过名称(“颁发者”字段)和 ID(“授权密钥标识符”字段)链接到其父证书,您可以使用这些 ID 找到它。AIA(“授权信息访问”)可能还包含 URL,以便于获取它们,但我发现通常情况并非如此)
答案2
我不知道有插件可以检查颁发日期,但检查证书的到期日期是check_http 插件。
具体来说,请参阅 -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。
如果你想检查链中的证书,你可能想尝试类似检查 SSL 证书。(我从未使用过它,但使用信息看起来可以满足您的要求。)