我试图使用C++库构建一个简单的客户机/服务器应用程序,使用示例代码作为示例,如本页所示- https://machinezone.github.io/IXWebSocket/usage/
当使用不安全连接(由ws:// url表示)时,代码运行良好,但在使用安全连接(由wss:// url表示)时,代码根本无法工作。
该网站在"TLS支持和配置“部分中声明:
然后,在连接到wss://* url时,自动使用安全套接字。其他的TLS选项可以通过将一个ix::SocketTLSOptions实例传递到setTLSOptions上配置::WebSocket(或ix::WebSocketServer或ix::HttpServer)。
这对我来说意味着,只需将ws:// url更改为wss:// url就足以指示应用程序保护连接,但这是行不通的。
当我尝试使用wss:// url连接时,服务器返回以下WebSocketServer::handleConnection() HTTP status: 400 error: Error reading HTTP request line
网站接着说
附加的TLS选项可以通过将
ix::SocketTLSOptions实例传递给ix::WebSocket上的setTLSOptions(或ix::WebSocketServer或ix::HttpServer)来配置。
还有..。
指定certFile和keyFile的certFile配置将用于与TLS对等方通信的证书。在客户端上,这仅用于连接到需要客户端证书的服务器。在服务器上,这对于支持TLS是必要的。
这意味着,要使服务器支持TLS,我必须提供一个cert文件和一个密钥文件。
github包含脚本generate_certs.sh,它以pem格式生成一系列证书,这应该足以使事情正常工作。其中包括selfsigned-client-crt.pem和selfsigned-client-key.pem,它们似乎是明显的候选,但是它们在名称中特别声明了client,这意味着它们不应该在服务器应用程序中使用,而应该属于客户端。
该网站还包括示例片段:
webSocket.setTLSOptions({
.certFile = "path/to/cert/file.pem",
.keyFile = "path/to/key/file.pem",
.caFile = "path/to/trust/bundle/file.pem", // as a file, or in memory buffer in PEM format
.tls = true // required in server mode
});我尝试填充certFile和keyFile属性,并为caFile属性指定"NONE“,在示例中解释了这一点,但是这会导致服务器应用程序将SocketServer::run() tls accept failed: error in handshake : SSL - The connection indicated an EOF打印到控制台。
更重要的是,上面列出的示例片段声明了"path/to/cert/file.pem"和"path/to/key/file.pem",但没有明确说明它们是客户端还是服务器使用。
这个例子没有提供一个完整的可运行的实现,也没有清楚地解释如何使TLS以这种特定的形式工作,我现在有点不知所措。github中有一个示例应用程序,但是它包含了许多不同的变体,所有这些都比这个简单的示例复杂得多,而且我需要使用这个简单的示例,以便进一步了解如何实现这个示例。
在我的服务器应用程序中,我为TLS选项实现了以下功能:
int port = 8443;
ix::WebSocketServer server(port);
ix::SocketTLSOptions tlsOptions;
tlsOptions.certFile = "certs/selfsigned-client-crt.pem";
tlsOptions.keyFile = "certs/selfsigned-client-key.pem";
tlsOptions.caFile = "NONE";
tlsOptions.tls = true; //Required for TLS
server.setTLSOptions(tlsOptions);我非常肯定,在我如何设置密钥和证书文件的问题。我在这里使用了客户端文件,但我也尝试生成和签名一个服务器证书和密钥,这也不起作用。
我甚至尝试为客户端和服务器应用程序使用可信密钥和证书,但仍然没有得到一个工作的TLS连接(以下文件是由generate_cert.sh脚本- selfsigned-client-crt.pem, selfsigned-client-key.pem, trusted-ca-crt.pem, trusted-ca-key.pem, trusted-client-crt.pem, trusted-client-key.pem, trusted-server-crt.pem, trusted-server-key.pem, untrusted-ca-crt.pem, untrusted-ca-key.pem, untrusted-client-crt.pem, untrusted-client-key.pem生成的)
..。其中没有一个是自签名服务器证书。我可以从示例页面中收集到的是,我需要执行以下操作才能完成此工作。
tlsOptions中的证书和密钥文件,将tlsOptions中的tls属性设置为在服务器上为真H 237<>H 138将caFile属性设置为tlsOptionsH 142将客户端的url设置为d43/code>url>h 244>
但是当我尝试它的时候,这是行不通的,所以很明显,我错过了一些东西。
我目前的目标是使用自签名证书,这样我就可以测试我的客户机和服务器,它们都运行在本地主机上。
如果有人能把我引向正确的方向,我会非常感激的。我已经做了4天了,我真的迷路了。
非常感谢
发布于 2022-09-23 10:53:05
检查此文件https://github.com/machinezone/IXWebSocket/blob/master/ws/test_ws.sh /它执行完整的客户端+服务器加密交换。
请注意,在macOS上有一些限制,但是在windows或linux上,使用mbedtls和openssl,一切都应该正常工作。
ps:您需要在客户端和服务器上提供相同的证书集。
https://stackoverflow.com/questions/71895782
复制相似问题