OpenSSL和可信系统证书

H K*_*H K 5 c++ linux openssl

因此,我已经知道如何使用来指定受信任证书的位置SSL_CTX_load_verify_locations()。现在文档说明以下内容:

SSL_CTX_load_verify_locations()指定ctx的位置,用于验证的CA证书位于该位置。通过CAfile和CApath可用的证书是受信任的。

并且还说:

查找CA证书时,OpenSSL库将首先在CAfile中搜索证书,然后在CApath中搜索证书。

没关系。但是没有提及驻留在OPENSSLDIR中的受信任系统证书。

  1. CAfile和CApath都失败后是否检查系统证书?
  2. 是否有呼叫SSL_CTX_set_default_verify_paths()覆盖SSL_CTX_load_verify_locations()?还是它们并肩工作,即受信任的系统证书以及CAfile和CApath指定的证书?
  3. 如果使用手动将证书添加到证书存储中SSL_CTX_get_cert_store(),即SSL_CTX_load_verify_locations()根本不调用证书,在这种情况下会发生什么?仅检查商店证书吗?无论如何要在这种情况下禁用/启用检查受信任的系统证书?

H K*_*H K 1

好吧..所以我尝试了一下并找出了我需要知道的内容。
设置:
- 简单的客户端和服务器,双方均启用对等验证
- 我创建了两个 CA。我们称它们为 SS(自签名)和 TR(可信)。
- SS 用于创建客户端 (SS_C) 和服务器 (SS_S) 证书。
- TR 用于创建客户端 (TR_C) 和服务器 (TR_S) 证书。
- TR CA 经过哈希处理并添加到默认 CA 目录中。

万无一失的测试:
SS_C 和 SS_S 的 -openssl verify会失败,除非我指定TR_C 和 TR_S 的CAfile
-openssl verify成功
结果如预期

客户端/服务器基本测试:
- 无验证路径调用:SS 失败 - TR 失败
- 调用SSL_CTX_set_default_verify_paths:SS 失败 - TR 成功
- 使用SSL_CTX_load_verify_locationsSS 作为 CA 文件调用:SS 成功 - TR 失败
结果符合预期


现在,让我们来看看更有趣的事情。
调用 和SSL_CTX_set_default_verify_pathsSSL_CTX_load_verify_locations
这种情况下,调用SSL_CTX_load_verify_locations始终使用 SS 作为 CA 文件。
- TR 成功 - 无论调用顺序如何
- SS 成功 - 无论调用顺序如何
有趣的结果 - 至少对我来说
现在,我可以预期使用证书存储也能工作

使用X509_STORE代替SSL_CTX_load_verify_locations
在本例中,我创建了 SS CA 的字节数组,获取上下文的证书存储,并将 SS CA 添加到其中。
- 仅获取上下文的存储并向其中添加 SS CA:SS 成功 -- TR 失败
- 仅获取上下文的存储(以测试是否添加默认的受信任证书):SS 失败 -- TR 失败
- 调用SSL_CTX_set_default_verify_paths+ 获取上下文的存储并添加SS CA 对其:SS 成功 - TR 成功
太棒了..它确实有效