c++ - OpenSSL 添加可信系统证书

标签 c++ linux openssl

所以我已经知道如何使用 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 中的可信系统证书。

  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(),那么在这种情况下会发生什么情况?是否只检查商店证书?在这种情况下无论如何要禁用/启用检查受信任的系统证书?

最佳答案

好吧..所以我试了一下,发现了我需要知道的东西。
设置:
- 双方启用对等验证的简单客户端和服务器
- 我创建了两个 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_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 成功
太棒了..它确实有效

关于c++ - OpenSSL 添加可信系统证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33421002/

相关文章:

linux - 如何从 N 个多行文件中获取一个包含 N 行的输出文件?

xcode - 在 XCode 中静态链接 OpenSSL

javascript - 使用 CryptoJS 解密 openssl_seal 中的密文

php - 为什么 phpseclib 生成不兼容的证书?

c++ - 在 C++ 上迭代 ini 文件,可能使用 boost::property_tree::ptree?

java - JNI C++ DLL - 'UnsatisfiedLinkError: %1 is not a valid Win32 application'

python - 不允许操作 : Server-setsockopt() error for SO_BINDTODEVICE

linux - 删除大型 csv 文件的列

java - 从 C++ 到 Java 行的命名管道连接,每个字符之间有空格

c++ - 在具有 const/nonconst 版本的 C++ 模板类上重载 [] 运算符