检查证书链涉及的证书的颁发日期和到期日期

Ajo*_*owe 3 certificate nagios openssl

是否可以仅通过传递域名来检查证书链中涉及的证书的颁发日期和到期日期?

我厌倦了各种 openssl s_client 属性,但我无法获取所需的信息。

要求:

传递一个域(以及端口 443),并使用 Linux 中的脚本或命令输出该域(Web 服务器)的证书链中涉及的颁发日期和到期日期。

mr.*_*tic 7

答案是肯定的,您可以使用 来做到这一点openssl,您可以轻松地将其包装为“检查”脚本,但我不知道是否有插件已经做到了这一点。

首先,缓存服务器证书和中间链:

echo Q | openssl s_client \
  -connect www.google.com:443 -servername www.google.com -showcerts > chain.pem
Run Code Online (Sandbox Code Playgroud)

(此链文件包含站点证书、中间链以及其他垃圾)

您也应该使用-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
Run Code Online (Sandbox Code Playgroud)

根据需要向嵌入命令中添加/省略-serial-issuer-fingerprint。您甚至可以将这两个步骤粘合在一起作为一行(注意省略重定向和出现次数):-purposeopensslchain.pem

echo Q | openssl ... | gawk ...
Run Code Online (Sandbox Code Playgroud)

如果您希望正确验证链(包括日期范围),请继续阅读。

接下来,只取出站点(第一个)证书,我将sed在这里使用,因为我很懒;-)

sed -n '/-BEGIN/,/-END/p;/-END/q' chain.pem > site.pem
Run Code Online (Sandbox Code Playgroud)

然后验证:

openssl verify -verbose -CAfile chain.pem site.pem
Run Code Online (Sandbox Code Playgroud)

这就是轮子脱落的地方:谷歌(正确地)没有在链中提供(自签名)根CA(或“信任锚”):

site.pem: /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
error 2 at 2 depth lookup:unable to get issuer certificate
Run Code Online (Sandbox Code Playgroud)

因此,从 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 .
Run Code Online (Sandbox Code Playgroud)

然后再试一次:

openssl verify -verbose \
  -CAfile chain.pem -CApath /usr/local/nagios/var/CA site.pem  
Run Code Online (Sandbox Code Playgroud)

(注意额外的-CApath参数)你会得到:

site.pem: OK  
Run Code Online (Sandbox Code Playgroud)

现在的坏消息是,openssl没有设置返回代码来指示成功、失败或任何有用的信息。您需要处理输出以确保一切正常,基本上除了单行“OK”之外的任何内容都表明存在问题。您正在查找的过期证书将显示为:

error 10 at 2 depth lookup:certificate has expired
Run Code Online (Sandbox Code Playgroud)

(其中深度可能会有所不同)。

注意事项和警告:

  • 服务器提供的链不应包含根(如果包含,客户端应该忽略它),通过添加指向-CApath /some/path受信任根证书的(预哈希)目录来解决此问题,如上所示
  • 这不会捕获链文件的错误排序,也不会捕获链文件中多余的证书(这对于浏览器来说通常都不是问题,但站点验证器通常会标记它们 - 至少这些不必要地使 HTTPS 握手变得混乱)
  • 服务器不需要提供整个链,特别是对于较长的链,在这种情况下,还需要将它们添加到 CApath 目录
  • 此处创建chain.pem的内容中有额外的文本垃圾,这不会出现问题openssl
  • 每个非根证书将通过名称(“颁发者”字段)和 ID(“权威密钥标识符”字段)链接到其父证书,您可以使用它们来查找它。AIA(“权威信息访问”)也可能包含 URL,以便更轻松地获取它们,但我发现通常情况并非如此)