无法从 https 客户端通过 wss 连接到 emqx mqtt 代理

Posted

技术标签:

【中文标题】无法从 https 客户端通过 wss 连接到 emqx mqtt 代理【英文标题】:Not able to connect to emqx mqtt broker over wss from https client 【发布时间】:2020-03-08 17:02:59 【问题描述】:

我有一个在 EC2 上运行的 emqx mqtt 代理,并且 ssl 和 wss 配置看起来像这样 -

listener.ssl.external = 8883
listener.ssl.external.keyfile = /etc/emqx/certs/key.pem
listener.ssl.external.certfile = /etc/emqx/certs/cert.pem
listener.ssl.external.cacertfile = /etc/emqx/certs/cacert.pem

listener.ws.external = 8083

listener.wss.external = 8084
listener.wss.external.keyfile = /etc/emqx/certs/key.pem
listener.wss.external.certfile = /etc/emqx/certs/cert.pem
listener.wss.external.cacertfile = /etc/emqx/certs/cacert.pem
listener.wss.external.verify = verify_none
listener.wss.external.fail_if_no_peer_cert = false

当我尝试使用没有 ssl(ws://IP:8083/mqtt) 的 emqx 仪表板(托管在 http)连接到代理时,它工作正常但是当我使用带有 ssl(wss)的 emqx 仪表板(托管在 https)时://IP:8084/mqtt),它没有连接。 wss上如何通过https连接broker?

编辑:我想要一种方式身份验证。我将从 React Web 应用程序和 NodeJS 应用程序连接到代理。所以,我不想从客户端提供证书。 我使用的证书是 EMQX 安装提供的证书。另外,我使用的是 EMQx 为 https ssl 提供的客户端证书。如果浏览器在没有任何警告的情况下打开 https,它也应该能够连接到 websocket。

【问题讨论】:

编辑问题以显示您用于连接的代码。此代码是否在浏览器中运行,如果是,您使用的是“真实”证书还是自签名证书? 我使用的是 emqx 提供的仪表板,在 18083 端口上可用。并且我生成了一个自签名证书以在 https 上运行仪表板。 请EDIT问题添加更多细节。您是否已将自签名证书导入浏览器信任存储区(不只是接受它用于连接)? 【参考方案1】:

Websocket 连接无法提供与您访问网页时获得的有关不受信任证书的相同警告。

这意味着无法告诉浏览器信任连接。如果您想使用自签名证书,则需要将它们导入浏览器信任存储区,以便明确信任它们。

另一种选择是使用 LetsEncrypt 之类的东西来获取浏览器已经信任的真实证书。

【讨论】:

我使用的是EMQx为https ssl提供的客户端证书。如果浏览器在没有任何警告的情况下打开 https,它也应该能够连接到 websocket。 您确定在代理上为 https 和 wss 使用相同的证书(不是客户端证书)吗? 你看,一个安装emqx的时候,提供了5个pem文件。 cacert.pem、cert.pem、key.pem、client-cert.pem、client-key.pem。现在,emqx 使用其 conf 中的前 3 个文件,而 apache 使用 client-cert.pem 和 client-key.pem 作为 ssl 证书和密钥。当我打开托管代理仪表板的域时,它会在没有任何 ssl 证书警告的情况下打开并显示 connection secure 符号。因此,这意味着浏览器能够识别证书。如果是这种情况,那么 websocket 也应该能够允许连接。【参考方案2】:

要么证书需要由 Ca 签发,以便浏览器自动验证。请注意,证书与域相同。

或者证书需要在浏览器中(自签名证书)。

或者您信任验证错误。

用浏览器打开:

https://localhost:8084/mqtt

会弹出一个信任错误。在这个错误页面,点击信任,然后:

wss://localhost:8084/mqtt

没关系。

【讨论】:

我正在使用子域访问代理。那么,我应该在生成证书时添加子域还是域可以工作?

以上是关于无法从 https 客户端通过 wss 连接到 emqx mqtt 代理的主要内容,如果未能解决你的问题,请参考以下文章

ClientWebSocket wss - 无法连接到远程服务器

如何使用 MQTT 连接到 wss?

无法连接到 wss [更新]

在wss://ws.luno.com/api/1/stream/:pair上以客户端身份连接到ssl Web套接字

带有代理的 WSS 使用端口 443 浏览器客户端连接到端口 6001 上的 websocket 服务器

如何通过 wss 快速连接到 MQTT?