所以我已经知道如何使用 SSL_CTX_load_verify_locations()
指定可信证书的位置。现在文档说明如下:
SSL_CTX_load_verify_locations() specifies the locations for ctx, at which CA certificates for verification purposes are located. The certificates available via CAfile and CApath are trusted.
还说:
When looking up CA certificates, the OpenSSL library will first search the certificates in CAfile, then those in CApath.
没关系。但是没有提及驻留在 OPENSSLDIR 中的可信系统证书。
- CAfile 和 CApath 都失败后是否检查系统证书?
- 调用
SSL_CTX_set_default_verify_paths()
是否覆盖SSL_CTX_load_verify_locations()
?还是它们并排工作,即受信任的系统证书和由 CAfile 和 CApath 指定的证书? - 如果使用
SSL_CTX_get_cert_store()
将证书手动添加到证书存储区,即根本没有调用SSL_CTX_load_verify_locations()
,那么在这种情况下会发生什么情况?是否只检查商店证书?在这种情况下无论如何要禁用/启用检查受信任的系统证书?
最佳答案
好吧..所以我试了一下,发现了我需要知道的东西。
设置:
- 双方启用对等验证的简单客户端和服务器
- 我创建了两个 CA。我们称它们为 SS(自签名)和 TR(受信任)。
- SS 用于创建客户端 (SS_C) 和服务器 (SS_S) 证书。
- TR 用于创建客户端 (TR_C) 和服务器 (TR_S) 证书。
- TR CA 被散列并添加到默认 CA 目录。
万无一失的测试:
- SS_C 和 SS_S 的 openssl verify
失败,除非我指定 CAfile
- openssl verify
TR_C 和 TR_S 成功
结果如预期
客户端/服务器基础测试:
- 无验证路径调用:SS 失败 -- TR 失败
- 调用 SSL_CTX_set_default_verify_paths
:SS 失败——TR 成功
- 使用 SS 作为 CAfile 调用 SSL_CTX_load_verify_locations
:SS 成功 -- TR 失败
结果如预期
现在,让我们来看看更有趣的东西。
同时调用 SSL_CTX_set_default_verify_paths
和 SSL_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 成功
太棒了..它确实有效
关于c++ - OpenSSL 添加可信系统证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33421002/