gpt4 book ai didi

c++ - 在 Windows 上获取根 CA 证书的可靠方法

转载 作者:搜寻专家 更新时间:2023-10-31 00:29:44 25 4
gpt4 key购买 nike

我正在使用 boost asio 连接到我的有效证书(由根 CA 签名)。我使用的代码是 ssl client example可从 boost 文档获得。

我添加的唯一一行是:

boost::asio::ssl::context ctx(boost::asio::ssl::context::sslv23_client);
ctx.set_default_verify_paths(); <------------- Add default verification paths
ctx.set_password_callback(&password_callback);

client c(io_service, ctx, iterator);

io_service.run();

问题是:将此代码与本地安装的 openSSH 拷贝(从 msi 安装程序安装)一起使用时,可以正确找到路径并验证我的证书。当我下载我自己的 openSSH 存储库拷贝并对其进行编译时,这一行不再有效,而且我没有根 CA 证书来验证我自己的证书(因此失败)。

因为我最终想在客户机器上分发这些客户端,所以我想避免设置环境变量,如 SSL_CERT_DIR 等。我如何使用 boost asio 可靠地找到根 CA 证书,或者从源代码编译中配置我的 openSSH 来找到它们?

最佳答案

您可以从 Windows CA 商店加载根 CA。它已经包含“默认”受信任的根 CA 证书,可以通过 certmgr 进行管理。 . windows下使用如下函数替换set_default_verify_paths:

#include <boost/asio/ssl/context.hpp>
#include <wincrypt.h>

void add_windows_root_certs(boost::asio::ssl::context &ctx)
{
HCERTSTORE hStore = CertOpenSystemStore(0, "ROOT");
if (hStore == NULL) {
return;
}

X509_STORE *store = X509_STORE_new();
PCCERT_CONTEXT pContext = NULL;
while ((pContext = CertEnumCertificatesInStore(hStore, pContext)) != NULL) {
X509 *x509 = d2i_X509(NULL,
(const unsigned char **)&pContext->pbCertEncoded,
pContext->cbCertEncoded);
if(x509 != NULL) {
X509_STORE_add_cert(store, x509);
X509_free(x509);
}
}

CertFreeCertificateContext(pContext);
CertCloseStore(hStore, 0);

SSL_CTX_set_cert_store(ctx.native_handle(), store);
}

这将从 windows ca 商店加载证书。它使用 d2i_X509 将它们转换为内部 OpenSSL 格式并将它们添加到 OpenSSL X509_STORE。然后 SSL_CTX_set_cert_store 将该存储附加到 boost ssl 上下文。您可以使用它来设置您的 ssl 上下文:

namespace ssl = boost::asio::ssl;
ssl::context ctx(ssl::context::tlsv12_client);
ctx.set_options(ssl::context::default_workarounds
| ssl::context::no_sslv2
| ssl::context::no_sslv3
| ssl::context::tlsv12_client);

#if BOOST_OS_WINDOWS
add_windows_root_certs(ctx);
#else
ctx.set_default_verify_paths();
#endif

ctx.set_password_callback(&password_callback);

client c(io_service, ctx, iterator);

io_service.run();

注意:您可能需要将 crypt32 添加到链接库中。

注2:BOOST_OS_WINDOWS需要Boost Predef

关于c++ - 在 Windows 上获取根 CA 证书的可靠方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39772878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com