0

我一直在学习 WebSocket++ 并构建了一些服务器示例(Windows 10 Visual Studio 2019)。非 TLS 示例可以正常工作,但是启用 TLS 的示例 (echo_server_both.cppecho_server_tls.cpp) 无法进行握手。一般来说,我对 Web 开发非常陌生,所以我知道我在证书和密钥方面一定做错了。

我正在使用 WebSocket King 客户端测试服务器,这是 Google Chrome 的一个扩展,wss://echo.websocket.org当我不使用 TLS 时,它可以正确连接到其他 websocket 服务器,比如我自己的本地主机。

echo_server_both示例附带server.pem文件,示例echo_server_tls附带server.pemdh.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 将它们识别为有效以便服务器工作?

4

1 回答 1

0

发现问题:WebSocket++ 不接受自签名证书(您可以使用 OpenSSL 或 Windows 实用程序直接在您自己的 PC 中创建的证书)。没有其他办法了。您必须拥有有效的、经过权威机构验证和认可的证书。您可以从https://zerossl.com/免费获得此类证书(仅 90 天有效)。该站点有关于如何请求、获取和安装证书的详细说明。获得有效证书并将其安装在我的服务器上后,一切正常。

于 2021-07-01T19:39:41.260 回答