【发布时间】:2018-10-14 22:53:01
【问题描述】:
我们有两个客户端,一个 javascript 和一个 C++。 C++ 正在使用 libwebsockets。他们都尝试通过安全 websockets (wss) 通过端口 7000 连接到我们的 websocket 服务器,该端口位于 NGINX 服务器后面。当javascript客户端连接时,连接成功,在NGINX 7000端口日志中显示:
[04/May/2018:12:25:30 +0000] "GET / HTTP/1.1" 101 0 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/ Safari/537.36"
但是,当尝试与 C++ 客户端连接时,连接失败并显示日志
[04/May/2018:10:59:40 +0000] "GET / HTTP/1.1" 400 5 "-" "-"
为什么在第二种情况下会抛出 400 而不是 101?我们不确定如何调试它。这是我们在websocket客户端中使用的
ws->init("wss://echo.websocket.org:7000", nullptr, "your CA root file path");
客户只是说Connection Failed。我们尝试使用 wireshark 检查数据并在 NGINX 服务器中启用更多日志,但我们无法弄清楚。它可以是什么?可能是因为 SSL/TLS 版本不匹配?
【问题讨论】:
-
您的服务器是否需要
Origin标头?您的 C++ 客户端是否发送了一个(通常不会,因为这是一个面向浏览器的标头)?日志指示连接请求失败,而不是协议或通信错误。根据服务器要求测试 C++ 端的 HTTP 标头,看看有什么问题。 -
这就是我们正在尝试的(比较标头),但我们在客户端或 NGINX 服务器上都找不到它们。我们尝试在客户端使用wireshark 并登录NGINX 服务器。即使我们确实找到了通信数据包,我们也无法在wireshark 中找到带有标头的数据包。我们也找不到在 NGINX 上查看标头的方法
-
我是老派,恕我直言,测试标头的最佳方法是在将它们发送到网络之前将它们打印到控制台。 TLS 使查看标头变得困难...此外,如果您没有获得标头,您的 C++ 客户端可能是 TCP/IP 套接字客户端而不是 WebSocket 客户端。
-
在您的最后一点上,即使我们使用的是构造函数
ws->init,可能是这样吗? -
我真的不知道......
标签: ssl nginx websocket tls1.2