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 似乎并没有得到真正的支持或至少没有得到维护。
我正在尝试在项目中使用 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 似乎并没有得到真正的支持或至少没有得到维护。