进行 SSL 证书域检查

Bas*_*974 2 https ssl-certificate

我正在尝试制作一个脚本来测试网站是否使用对其域有效的非自签名证书。这意味着它不会在浏览器中显示警告。

我试过

openssl s_client -connect www.example.com:443 -servername www.example.com
Run Code Online (Sandbox Code Playgroud)

即使证书对该域无效,我仍然得到:

验证返回码:0(确定)

知道我怎么能做到这一点吗?

Jen*_*y D 7

如果您希望 openssl 实际验证证书,则需要告诉它这样做。

1. 检查证书上的主机名是否与您想要的名称匹配

有一个特定的选项,-verify_hostname. 在下面的命令中,我在 serverfault.com 上使用它,但我正在检查主机名 example.com:

[jenny@temeraire crt] $ openssl s_client -verify_hostname example.com  -connect serverfault.com:443
CONNECTED(00000003)
[...]
    Verify return code: 62 (Hostname mismatch)
---
DONE
Run Code Online (Sandbox Code Playgroud)

但是,进程本身的返回码仍然是 0,这意味着您必须查看输出而不是在测试中使用返回码。

2. 检查证书是否来自受信任的 CA

我已经在 serverfault.com 网站上运行了它,但没有给它一个受信任的 CA:s 列表来再次检查,这样就可以保证验证失败:

[jenny@galactica tmp] $ openssl s_client -verify 2 -connect serverfault.com:443
[...]
    Verify return code: 27 (certificate not trusted)
Run Code Online (Sandbox Code Playgroud)

但是,openssl 仍然会给您返回代码 0,因为该命令实际上已正确执行,这使得编写脚本变得更加困难。

更好的方法是首先下载证书,然后openssl verify针对它运行:

[jenny@galactica tmp] $ openssl verify selfsignedcert.pem; echo $?
selfsignedcert.pem: C=SE, O="Nevermind", CN=foo.example.com
error 18 at 0 depth lookup: self signed certificate
18
Run Code Online (Sandbox Code Playgroud)

如您所见,我得到了返回代码 18,这意味着“自签名证书”。还有许多其他错误代码;查看手册页verify了解更多信息。