openssl:强制没有默认 CA 证书,以验证私有签名证书

openssl:强制没有默认 CA 证书,以验证私有签名证书

我想验证我的网络服务器是否使用我的自签名证书正确配置。 Web 服务器还有一些常规购买的 CA 签名证书。

我面临的挑战是我无法禁用常规的内置 CA 证书。即使测试我的自签名证书也cnn.com可以吗?!?

openssl s_client -CAfile my.pem -CApath /dev/null -cert my.pem -connect cnn.com:443
[...]
Verify return code: 0 (ok)

如果 Web 服务器上未安装匹配的自签名证书,我如何才能openssl抛出错误?

答案1

s_client(1ssl)手册页:

s_client 实用程序是一个测试工具,旨在在出现任何证书验证错误后继续握手。因此,它将接受对等方发送的任何证书链(可信或不可信)。非测试应用程序不应这样做,因为这会使它们容易受到 MITM 攻击。可以使用 -verify_return_error 选项更改此行为:然后返回任何验证错误并中止握手。

因此,您需要将-verify_return_error选项添加到命令行中才能实际捕获证书验证错误。

或者,您可以使用此 shell 函数以人类可读的形式直接查看任何 TLS 服务器的证书信息:

tlscert() {
    openssl s_client -CApath /dev/null -connect "$@" </dev/null 2>/dev/null \
        | sed -n '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/p' \
        | openssl x509 -noout -text -certopt no_pubkey,no_sigdump,no_header,ext_parse \
            -nameopt multiline,show_type
}

将其添加到您的.bashrc或类似的注销和登录中,然后运行例如tlscert cnn.com:443。如果远程服务器使用 StartTLS,您仍然可以使用此命令,例如tlscert imap.domain.example:143 -starttls imap

注:-starttls选项必须是参数hostname:port

相关内容