【问题标题】:boost asio certificate verification提升 asio 证书验证
【发布时间】:2021-06-23 17:10:38
【问题描述】:

我正在为嵌入式 linux 系统编写代码,我有一些基于 boost beast websockets 的代码,它能够成功连接到几个不同的 TLS 加密网站。但是我发现了另一个,它不工作,但只在嵌入式 linux 平台上。

我正在这样设置上下文;

boost::asio::ssl::context tlsCtx {boost::asio::ssl::context::tlsv12_client};
tlsCtx.set_options(boost::asio::ssl::context::default_workarounds
                 | boost::asio::ssl::context::no_sslv2
                 | boost::asio::ssl::context::no_sslv3
                 | boost::asio::ssl::context::no_tlsv1
                 | boost::asio::ssl::context::no_tlsv1_1
                 | boost::asio::ssl::context::single_dh_use);

tlsCtx.set_default_verify_paths();

代码也执行

 ws_.next_layer().set_verify_mode(boost::asio::ssl::verify_peer);

此代码可以在我自己的运行 Ubuntu 的笔记本电脑上连接到网站。但是在嵌入式设备上,这会因certificate verify failed 而失败。最初我认为嵌入式系统上不存在根授权证书,但在我的系统上存在。但是两者都使用ca-certificates 包。我在笔记本电脑上发现文件/etc/ssl/certs/ca-certificates.crt 包含用于验证网站上的证书的根授权证书。

把代码改成

boost::asio::ssl::context tlsCtx {boost::asio::ssl::context::tlsv12_client};
tlsCtx.set_options(boost::asio::ssl::context::default_workarounds
                 | boost::asio::ssl::context::no_sslv2
                 | boost::asio::ssl::context::no_sslv3
                 | boost::asio::ssl::context::no_tlsv1
                 | boost::asio::ssl::context::no_tlsv1_1
                 | boost::asio::ssl::context::single_dh_use);

tlsCtx.load_verify_file("/etc/ssl/certs/ca-certificates.crt");

适用于我的笔记本电脑和嵌入式设备。但是,我需要支持所有 TLS 加密的网站,而不仅仅是这个。所以我使用set_default_verify_paths 来包含ca-certificates.crt 文件中未包含的根授权证书。

所以更新代码到这个;

boost::asio::ssl::context tlsCtx {boost::asio::ssl::context::tlsv12_client};
tlsCtx.set_options(boost::asio::ssl::context::default_workarounds
                 | boost::asio::ssl::context::no_sslv2
                 | boost::asio::ssl::context::no_sslv3
                 | boost::asio::ssl::context::no_tlsv1
                 | boost::asio::ssl::context::no_tlsv1_1
                 | boost::asio::ssl::context::single_dh_use);

tlsCtx.set_default_verify_paths();
tlsCtx.load_verify_file("/etc/ssl/certs/ca-certificates.crt");

我原以为会支持所有场景,但它可以在我的开发笔记本电脑上运行,但使用嵌入式设备时,我得到了certificate verify failed

我知道嵌入式系统上有正确的根授权证书,但当我也包含所有默认验证路径时,它似乎不想工作。有谁知道为什么会这样?

【问题讨论】:

  • Offtopic:在函数范围内添加using boost::asio::ssl::context; 应该会使其更具可读性。

标签: c++ linux boost-asio x509 boost-beast


【解决方案1】:

我会在设备上添加缺少的根证书。奇怪的是/etc/ssl/certs已经包含了它的.crt文件,也许你只需要重新运行c_rehash

根据您的发行版(您奇怪地忽略了?),您还可以使用像 update-ca-certificates 这样的实用程序来执行此操作,等等

【讨论】:

  • 笔记本电脑发行版是 Ubuntu,嵌入式设备是 buildroot。是的,根授权证书似乎已经在设备上,但在我调用“set_default_verify_paths”时被忽略。
  • @Alex 这就是为什么我怀疑哈希索引不是最新的。这可能是相应 buildroot 包中的缺陷(如果适用的话?)。
  • 如果我随后明确地将/etc/ssl/certs/ca-certificates.crt 包含在tlsCtx.load_verify_file 中,结果证明它可以工作,buildroot 包似乎与 Ubuntu 中使用的包相同。我想我之前尝试过时出了点问题,但我就这样离开了。
猜你喜欢
  • 1970-01-01
  • 2013-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-24
  • 2013-05-29
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多