通过端口 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 容器的名称 = 主机名) mod_proxy_wstunnel
,使用ProxyPass
/wss/ws://mosquitto:8883and
ServerName 子域`(现在有自己的MQTT子域)没有帮助。尝试连接 MQTT 客户端(仅通过浏览器)时,Apache 日志不显示条目。我已经尝试了***.com/questions/17334319/… 中提到的所有组合 - 通过向其提供 MQTT 证书来接受 Apache 中的 SSL 终止。
终于可以使用 SNI 和一个不关心内容的专用代理服务,因此不需要理解它。以上是关于通过端口 443 和 apache 访问 mosquitto的主要内容,如果未能解决你的问题,请参考以下文章
Apache 甚至更改端口 80 和端口 443 都拒绝打开