SSL_set_tlsext_host_name 崩溃

SSL_set_tlsext_host_name crashes

我正在尝试在项目中使用 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 时崩溃。

原来这是一个 linking 问题:该应用程序使用另一个使用 boringssl 的库 (WebRTC)。不知何故,linker 在 WebRTC 之后 linking OpenSSL 时并没有抱怨重复的符号,而是默默地使用了 boringssl 的功能。 MSVC 和 gcc 都可以做到。

我通过将 websocket/OpenSSL 代码移动到一个 dll 中来解决它,这允许它独立于应用程序正确地 link 针对 OpenSSL。

不是最漂亮的解决方案,但使用 OpenSSL 构建 WebRTC 似乎并没有得到真正的支持或至少没有得到维护。