禁用WebSocket证书验证

10
我需要禁用WebSocket的证书验证,因为我正在使用自签名证书。在这个问题Websocket SSL connection中,我找到了rejectUnauthorized参数,但那已经不起作用了。实际上,如果你去看 Mozilla文档,只有两个参数:URL和协议版本。
在另一个问题或网站(不记得具体是哪里)中,我发现如果我首先访问https://server_ip,会出现关于无效证书的提示,询问是否要继续。然后我可以使用wss://server_ip连接,它可以工作,但对我的情况来说不可用。
所以,我需要在创建WebSocket时禁用证书验证。我该怎么做?
我用于测试的代码是https://www.websocket.org/echo.html上的代码。我用websocket = new WebSocket(wsUri, {rejectUnauthorized: false});替换了websocket = new WebSocket(wsUri);(在测试期间,还添加了protocolVersion: 8参数,就像链接的问题一样)
编辑:我需要使用自签名证书。Let's Encrypt并不可行,因为它需要一个子域名,而我需要管理数百到数千个子域名。该应用程序分为三个部分,将部署到每个客户(数百个):
- 管理控制台:使用子域名和LE证书。 - WebSocket服务器1:需要使用IP进行加密连接。 - WebSocket服务器2:需要使用IP进行加密连接。

你是在谈论在你的机器上进行一次性工作,还是一般访问者使用网站的通用方式? - James Thorpe
@JamesThorpe 一般的方式是,客户端将下载一个 JavaScript 文件,在后台连接到一些 Python WebSocket 服务器。 - user4093955
@TheIllusiveMan 我知道已经过了一段时间,但你解决了吗? - rightaway717
1个回答

3

可能我来晚了,但是我曾经遇到过同样的问题,没有找到确切的答案,于是我去阅读了实现文档

方法

connect(requestUrl, requestedProtocols, [[[origin], headers], requestOptions])

将建立与给定的 requestUrl 的连接。 requestedProtocols 表示客户端支持的多个子协议列表。远程服务器将在建立连接时选择它支持的最佳子协议并将其发送回来。origin 是一个可选字段,可用于用户代理方案,以标识包含任何脚本内容的页面,该内容导致请求连接。 requestUrl 应为标准 WebSocket URL。

headers 应为 null 或指定要与请求一起发送的其他任意 HTTP 请求头的对象。这可用于传递像访问令牌等信息,以便服务器在决定接受并打开完整的 WebSocket 连接之前验证身份认证/授权。

requestOptions 应为 null 或指定要传递给 http.request 或 https.request 的 附加配置选项 的对象。这可用于传递自定义代理以启用从 HTTP 或 HTTPS 代理服务器后使用 WebSocketClient。

如果要传递头,则必须指定 origin,如果要传递 requestOptions,则必须同时指定 origin 和 headers。可以将 origin 和 headers 参数设置为 null。

因此,正如文档所述,除非您对这些参数中的任何一个具有特定配置,否则应将其传递为 null。这解决了迷宫问题。

var client = new WebSocket();
client.connect(WSSrvUrl, null, null, null, {rejectUnauthorized: false});
//or depending on the implementation you're using (this applies to Nodejs and web browser implementation:
var client = new WebSocket(WSSrvUrl, null, null, null, {rejectUnauthorized: false});

And that's it.

SDG


我在文档中没有看到这样的构造函数,并且它对我也不起作用。 它只适用于NodeJS吗? - rightaway717
确实,伙计,正如我在上面引用的文档中所看到的。如果你正在寻找浏览器WS客户端,那么实际上更容易,因为浏览器本身会以图形方式向你展示如何继续访问网站,尽管SSL/TLS证书是“不安全”的,也就是自签名的。 - Andrew
我担心进入一个不安全的网站,按下额外的按钮,在那里阅读大量声明其不安全的文本,最终到达页面绝对不是用户友好的,我们不能向客户销售它。 - rightaway717
如果你打算商业化/出售你的开发/代码,那么你应该花点钱从知名签名公司购买适当的 HTTPS 证书。 - Andrew
@安德鲁 软件开发并非全是非此即彼。在我的情况下,我需要在本地连接两个设备,通过一个外部云服务进行通信。由于这两个设备位于同一站点,它们会知道它们是否连接成功。尽管如此,我希望出站的云连接是安全的。我应该能够通过一套适当的证书来实现这一点,而不需要花费太多钱。 - Yoav Moran
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接