ssl - SSL_CTX_set_verify 回调从哪里获取证书?

标签 ssl openssl certificate client-certificates

我需要使用 OpenSSL 验证客户端证书。但是,我没有根证书(只有受信任的中间证书)。

我开始四处寻找如何做到这一点,并找到了几个链接:

大致的总结是“设置回调(使用 SSL_CTX_set_verify)并忽略此回调中的错误”。

回调将被多次调用(对于链中的每个证书)并且文档说:

The certificate chain is checked starting with the deepest nesting level (the root CA certificate) and worked upward to the peer's certificate. At each level signatures and issuer attributes are checked.

我的问题是 OpenSSL 从哪里获得这些证书链?它是从客户端获取(意味着他们不受信任)还是从受信任的商店获取(意味着他们受信任)。

在这种情况下,如果只有客户端证书来自客户端,我几乎可以忽略深度 > 0(中间证书)的所有错误。在这种情况下,如果客户端可以发送整个链,那么我不能只忽略错误,而是需要进行额外的验证。

附言我的实验表明 depth=1 是中间可信证书,depth=0 是客户端发送的证书。然而,这是不确定的。

最佳答案

整个链来自客户端,其中最顶层的元素应该是您在 CertificateRequest 消息中表示信任的 CA 的元素。否则客户端不应该发送任何东西(可能是一个空链)。

出于您的目的,您信任的任何证书都是根证书。所以您需要做的就是确保您自己的信任证书集中最顶层的证书存在,然后进行链的正常验证。

关于ssl - SSL_CTX_set_verify 回调从哪里获取证书?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42544775/

相关文章:

ssl - SSL 上的 DNS 循环

c - AES CTR OpenSSL 命令行与 EVP_aes_128_ctr C 代码不匹配

Java 证书客户端 SSL : unable to find valid certification path to requested target

java - 无法从 X509Certificate 的 X500Principal 获取 UniqueIdentifier

python - 如何使用 p12 证书连接到 LDAP 服务器

git - Julia 证书错误

amazon-web-services - 在 AWS EC2 实例上托管 Jupyter Notebook 时无法获得可信连接

ssl - 带 SSL 的 Nginx 上的 SocketIO

openssl - 如何将 SSL_CERT_FILE 用于 OpenSSL Windows (OpenSSL 1.0.1c)

linux - 使用 openssl 命令获取证书的主题 key 标识符