首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在IXWebSocket中为简单的客户机/服务器应用程序启用TLS

如何在IXWebSocket中为简单的客户机/服务器应用程序启用TLS
EN

Stack Overflow用户
提问于 2022-04-16 16:51:49
回答 1查看 215关注 0票数 0

我试图使用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::WebSocketServerix::HttpServer)来配置。

还有..。

指定certFile和keyFile的certFile配置将用于与TLS对等方通信的证书。在客户端上,这仅用于连接到需要客户端证书的服务器。在服务器上,这对于支持TLS是必要的。

这意味着,要使服务器支持TLS,我必须提供一个cert文件和一个密钥文件。

github包含脚本generate_certs.sh,它以pem格式生成一系列证书,这应该足以使事情正常工作。其中包括selfsigned-client-crt.pemselfsigned-client-key.pem,它们似乎是明显的候选,但是它们在名称中特别声明了client,这意味着它们不应该在服务器应用程序中使用,而应该属于客户端。

该网站还包括示例片段:

代码语言:javascript
复制
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
});

我尝试填充certFilekeyFile属性,并为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选项实现了以下功能:

代码语言:javascript
复制
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生成的)

..。其中没有一个是自签名服务器证书。我可以从示例页面中收集到的是,我需要执行以下操作才能完成此工作。

  1. 生成服务器证书,密钥
  2. 自签名证书
  3. 指定服务器上tlsOptions中的证书和密钥文件,将tlsOptions中的tls属性设置为在服务器上为真H 237<

>H 138将caFile属性设置为tlsOptionsH 142将客户端的url设置为d43/code>url>h 244>

但是当我尝试它的时候,这是行不通的,所以很明显,我错过了一些东西。

我目前的目标是使用自签名证书,这样我就可以测试我的客户机和服务器,它们都运行在本地主机上。

如果有人能把我引向正确的方向,我会非常感激的。我已经做了4天了,我真的迷路了。

非常感谢

EN

回答 1

Stack Overflow用户

发布于 2022-09-23 10:53:05

检查此文件https://github.com/machinezone/IXWebSocket/blob/master/ws/test_ws.sh /它执行完整的客户端+服务器加密交换。

请注意,在macOS上有一些限制,但是在windows或linux上,使用mbedtls和openssl,一切都应该正常工作。

ps:您需要在客户端和服务器上提供相同的证书集。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71895782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档