通过端口 443 和 apache 访问 mosquitto

Posted

技术标签:

【中文标题】通过端口 443 和 apache 访问 mosquitto【英文标题】:accessing mosquitto via port 443 and apache 【发布时间】:2021-05-05 09:19:41 【问题描述】:

我正在使用 TLS 在名为“mosquitto”的 docker 容器中运行 MQTT Mosquitto 服务器,侦听端口 8883。

在同一网络中的另一个 docker 容器中,我正在运行一个 Apache 网络服务器,其网页位于 my_domain(端口 443)。

Apache 应将所有发往my_domain/mosquitto 的请求转发给 Mosquitto 代理。 使用 my_domain/mosquitto。因此我添加了

  ProxyPreserveHost On
  ProxyPass /mosquitto ws://mosquitto:8883
  ProxyPassReverse /mosquitto ws://mosquitto:8883

到我的 httpd.conf,它将 https-browser-calls 重定向到 my_domain/mosquitto 到 mosquitto。 这当然会导致 Mosquitto 出现 OpenSSL 错误。

但是使用 MQTT 客户端 (python) 会导致 Name or service not known

我做错了什么?

附: Apache 和 Mosquitto 的 SSL 密钥/证书是不同的。 禁用网络服务器时,通过 docker 将 Mosquitto 重定向到端口 443,连接正常。

【问题讨论】:

你是在告诉python客户端使用/mosquitto路径吗? MQTT over websockets 的默认值为 /mqtt 我告诉python客户端/mosquitto(=my_domain/mosquitto,我也试过ws://my_domain/mosquitto)因为我在Apache的httpd.conf中有ProxyPass作为子目录@987654333 @。在 mosquitto 的配置中,我没有启用 websockets。据我了解,这是在浏览器中使用 Mosquitto。 我发现有两个选项我很遗憾无法使用:1. 不使用 TLS 和 Apache 模块进行 MQTT 重定向 2. Apache 中的 TLS 终止 在这种情况下,您必须使用 MQTT over Websockets 【参考方案1】:

要使用 HTTP 反向代理 (Apache) 代理 MQTT 代理,您必须使用 Websocket 的 MQTT(因为 WebSocket 连接是通过 HTTP 引导的)。

原生 MQTT 连接将无法正常工作,因为 Apache 无法理解原生协议格式。

您需要在 Mosquitto 中启用 Websocket 侦听器并告诉客户端进行 Websocket 连接。

您还应该使用/mqtt 而不是/mosquitto 作为代理路径,因为这是WebSocket 连接的默认路径

【讨论】:

所以mosquitto.conf: listener 8883 protocol websockets require_certificate true ... `httpd.conf: (mosquitto 是 docker 容器的名称 = 主机名) ProxyPreserveHost On ProxyPass /mqtt wss://mosquitto:8883 ProxyPassReverse /mqtt wss://mosquitto:8883 客户端:(例如 python / paho.mqtt)端口 = 443 代理 = 'wss://domain_name/mqtt' 客户端 = mqtt_client.Client (transport="websockets") client.tls_set( ...) client.connect(broker, port) ??? 顺便说一句:有一个用于 MQTT 协议处理的 Apache 模块 - 但这仅适用于无 TLS 连接。 blog.benjamin-cabe.com/2015/10/01/… 不,没有。如果您阅读该博客文章,它仍在使用 MQTT over WebSockets,它只是在 Apache 终止 WebsSocket 连接,然后将本机连接转发到代理。但鉴于如今大多数代理本身都支持 WebSockets,因此不再需要该模块。 激活mod_proxy_wstunnel,使用ProxyPass /wss/ws://mosquitto:8883and ServerName 子域`(现在有自己的MQTT子域)没有帮助。尝试连接 MQTT 客户端(仅通过浏览器)时,Apache 日志不显示条目。我已经尝试了***.com/questions/17334319/… 中提到的所有组合 - 通过向其提供 MQTT 证书来接受 Apache 中的 SSL 终止。 终于可以使用 SNI 和一个不关心内容的专用代理服务,因此不需要理解它。

以上是关于通过端口 443 和 apache 访问 mosquitto的主要内容,如果未能解决你的问题,请参考以下文章

AWS - 无法通过 443 端口访问 EC2 实例

创建隧道以便通过端口 443 访问 https

Apache 甚至更改端口 80 和端口 443 都拒绝打开

Citrix DDC添加443端口证书通过SSL加密访问

EC2onRails + SSL + Apache:端口 443 无响应

443端口关闭,无法访问https类网页,该如何解决啊?