我正在尝试编写一个脚本来测试某个网站是否正在使用对其域名有效的非自签名证书。这意味着它不会在浏览器中显示警告。
我曾尝试过
openssl s_client -connect www.example.com:443 -servername www.example.com
即使该证书对于该域无效,我仍然会得到:
验证返回代码:0(确定)
知道如何实现吗?
答案1
如果您希望 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
但是,进程本身的返回码仍然为 0,这意味着您必须查看输出,而不是在测试中使用返回码。
2. 检查证书是否来自受信任的 CA
我已经针对 serverfault.com 网站运行了它,但没有给它提供受信任的 CA 列表来再次检查,因此它肯定会验证失败:
[jenny@galactica tmp] $ openssl s_client -verify 2 -connect serverfault.com:443
[...]
Verify return code: 27 (certificate not trusted)
但是,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
如您所见,我得到了返回代码 18,这意味着“自签名证书”。还有许多其他错误代码;查看手册页以verify
获取更多信息。