通过Web套接字使用HTTPS从浏览器连接MQTT客户端

7

我希望能够在使用HTTPS的情况下,通过Web Sockets在Web浏览器上运行mqtt客户端。在使用HTTP时,我没有问题。以下是在使用HTTP时Web浏览器上的代码:

<script>
      var client  = mqtt.connect( 'wss://127.0.0.1:3000', {username:'test_user', password:'test_password'} );
      client.subscribe("mqtt/test");

      client.on("message", function(topic, payload) {
        alert([topic, payload].join(": "));
        client.end();
      });

      client.publish("mqtt/test", "testing hello world!");
</script> 

这是我启动独立的Mosca代理服务器并使用HTTPS进行Websockets的方法。

mosca --very-verbose --key ./tls-key.pem --cert ./tls-cert.pem --credentials ./credentials.json --https-port 3000 --https-bundle --https-static ./ | pino

我应该如何更改我的MQTT客户端代码,以通过HTTPS连接到使用WebSockets的Mosca代理?


请使用 wss://127... 替代 ws.... - Molda
Molda,我尝试过了,但是出现了错误:“WebSocket连接到'wss://127.0.0.1:3000/'失败:WebSocket开启握手被取消”。 - guagay_wk
这可能与SSL证书有关。你是如何创建的,为哪个域名? - Molda
Molda,这是一个自签名证书。域名只是本地主机。 - guagay_wk
然后尝试 wss://localhost:3000... - Molda
2个回答

6
正如你之前提出的问题所讨论的那样,网络浏览器有它自己的可信CA证书列表,你的自签名证书不在这个列表中,因此连接将失败。
你可以将自己的受信任证书导入到浏览器中,但是每个浏览器的操作方式都不同,并且您必须为每个浏览器实例执行此操作,因此仅对个人测试非常有用。
如果您需要允许公众成员(或无法安装您的证书的浏览器)连接到代理,则必须从认可的CA获取证书。您必须支付费用或使用像http://letsencrypt.org这样的服务。

当访问HTTP网站时,如果证书是自签名的,浏览器通常会提示用户该特定页面不安全。连接不应该在没有提示的情况下失败。 - guagay_wk
4
当浏览器是由 JavaScript 初始化时,浏览器不会提示。 - hardillb
hardillb,我开始了一个悬赏,所以我暂时取消了标记的答案,给新的回答一个机会。非常感谢你到目前为止的帮助。 - guagay_wk

2
您由于使用自签名证书而遇到了问题。相反,您可以选择以下方式来解决:
  1. 使用服务商 cloudflare 作为前端(免费版本支持 https 和 wss)。了解更多信息,请参考 cloud flare
  2. 获取 letsencrypt 的临时证书(有免费方案)。了解更多信息,请参考letsencrypt
  3. 获取可信赖的付费证书。
请注意,以上内容中保留了 HTML 标签。

一个快速的提示,Cloudfare无法用于本地MQTT连接。 - hardillb

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