【发布时间】: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