c++ - SSL_set_tlsext_host_name 崩溃

标签 c++ ssl boost openssl boost-beast

我正在尝试使用 scio_beast在一个项目中。我知道它还没有完成,但这并不重要。我已经设法让它工作得很好。
我现在正在尝试连接到 CloudFlare 后面的服务器,我知道我需要 SNI 才能工作。
鉴于以下情况:

using tcp           = boost::asio::ip::tcp;     //  <boost/asio/ip/tcp.hpp>
namespace websocket = boost::beast::websocket;  //  <boost/beast/websocket.hpp>
namespace ssl       = boost::asio::ssl;         //  <boost/asio/ssl.hpp>

typedef websocket::stream<ssl::stream<tcp::socket>>  SecureWebSocket;
typedef std::unique_ptr<SecureWebSocket>            SecureWebSocketPtr;

// ...

SecureWebSocketPtr m_wss;

m_sslContext = std::make_shared<ssl::context>(ssl::context::tlsv12_client);
m_wss.reset(new SecureWebSocket(m_ios, *m_sslContext.get()));

auto ssl = m_wss->next_layer().native_handle();
auto host = m_connectOptions.host.c_str();
SSL_set_tlsext_host_name(m_wss->next_layer().native_handle(), host);

我在哪里打电话似乎无关紧要SSL_set_tlsext_host_name (例如,在解析之前,在 async_handshake 之前),它总是在尝试执行 0x0000000000000000 时崩溃。

最佳答案

原来这是一个链接问题:该应用程序使用了另一个使用boringssl的库(WebRTC)。不知何故,链接器在 WebRTC 之后链接 OpenSSL 时并没有提示重复的符号,而是默默地使用了boringssl 的函数。 MSVC 和 gcc 都这样做。
我通过将 websocket/OpenSSL 代码移动到一个 dll 中解决了这个问题,这允许它独立于应用程序正确链接到 OpenSSL。
不是最漂亮的解决方案,但似乎并没有真正支持或至少维护使用 OpenSSL 构建 WebRTC。

关于c++ - SSL_set_tlsext_host_name 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66823207/

相关文章:

C++ boost compilation 灾难

c++ - STL 映射的迭代器++ 复杂性

c++ - 使用 ffmpeg 从 C++ 内存中的多个图像流式传输 RTSP

swift - 如何快速向服务器发出 HTTPS 请求?

multithreading - 使用boost的SSL asio代码,async_write_some挂起

c++ - 用智能指针替换现有的原始指针

c++ - 更改子进程中的 iostream

带有等待窗口的 C++ 线程终止

apache - 如何使用别名在 Apache 虚拟主机上配置多个 SSL 证书?

c++ - boost::thread 构建错误(无法链接 lib && 未解析的外部)