我一直在学习 WebSocket++ 并构建了一些服务器示例(Windows 10 Visual Studio 2019)。非 TLS 示例可以正常工作,但是启用 TLS 的示例 (echo_server_both.cpp
和echo_server_tls.cpp
) 无法进行握手。一般来说,我对 Web 开发非常陌生,所以我知道我在证书和密钥方面一定做错了。
我正在使用 WebSocket King 客户端测试服务器,这是 Google Chrome 的一个扩展,wss://echo.websocket.org
当我不使用 TLS 时,它可以正确连接到其他 websocket 服务器,比如我自己的本地主机。
echo_server_both
示例附带server.pem
文件,示例echo_server_tls
附带server.pem
和dh.pem
。我使用了与示例相同的文件,我还尝试使用 openSSL 生成和注册我自己的 .pem 文件。在这两种情况下,当客户端尝试连接时我都会得到这个:
[2021-06-29 20:51:21] [error] handle_transport_init received error: sslv3 alert certificate unknown
[2021-06-29 20:51:21] [fail] WebSocket Connection [::1]:63346 - "" - 0 asio.ssl:336151574 sslv3 alert certificate unknown
[2021-06-29 20:51:21] [info] asio async_shutdown error: asio.ssl:336462231 (shutdown while in init)
我在编辑后发现了这些错误handle_init()
,tls.hpp
按照另一个网站的建议,看起来像这样:
void handle_init(init_handler callback,lib::asio::error_code const & ec) {
if (ec) {
//m_ec = socket::make_error_code(socket::error::tls_handshake_failed);
m_ec = ec;
} else {
m_ec = lib::error_code();
}
callback(m_ec);
}
此更改让实际的 openSSL 错误显示在控制台中,否则将显示一般的“握手失败”错误。
我知道我没有对证书做我应该做的事情,但我不知道还能去哪里看或下一步该做什么。有人可以帮忙吗?我应该使用示例附带的 .pem 文件,还是应该自己生成?如果我应该生成我自己的,那么正确执行该操作的 openSSL 命令是什么?我如何告诉我的 PC 将它们识别为有效以便服务器工作?