Websockets + TLS 的 Mosquitto 配置

Posted

技术标签:

【中文标题】Websockets + TLS 的 Mosquitto 配置【英文标题】:Mosquitto configuration for Websockets + TLS 【发布时间】:2015-11-28 15:46:36 【问题描述】:

一段时间以来,我一直在 debian 8 上使用 mosquitto + websockets,效果很好。现在我想将系统转移到预生产,所以我需要开始加密这些通信。

我已尝试按照此博文 (http://embeddedprog.blogspot.pt/2014/05/tlsssl-communication-via-mqtt.html) 中的步骤以及 J-P Mens (https://github.com/owntracks/tools) 中的证书生成脚本手动生成证书

我的“mosquitto.conf”如下所示:

allow_anonymous false
allow_duplicate_messages false
autosave_interval 1800
persistence true
persistence_file mosquitto.db
persistence_location /tmp/
connection_messages true
log_timestamp true
#log_dest syslog

#log_type error
#log_type warning
#log_type notice
#log_type information
log_type all
log_type debug


listener 8880
protocol mqtt

listener 8881
protocol websockets
bind_address hi-server
cafile /home/hi/cert/ca.crt
certfile /home/hi/cert/hi.com.crt
keyfile /home/hi/cert/hi.com.key
tls_version tlsv1
#require_certificate false

#
#   __  __       ____   ___  _
#  |  \/  |_   _/ ___| / _ \| |
#  | |\/| | | | \___ \| | | | |
#  | |  | | |_| |___) | |_| | |___
#  |_|  |_|\__, |____/ \__\_\_____|
#          |___/
#
#

#auth_plugin /home/jpm/mosquitto-auth-plug/auth-plug.so
auth_plugin /etc/mosquitto/auth-plug.so
[auth_opt stuff...]

这是 mosquitto 的详细输出:

1448802719: mosquitto version 1.4.2 (build date 2015-11-27 23:40:02+0000) starting
1448802719: Config loaded from /etc/mosquitto/mosquitto.conf.
1448802719: |-- *** auth-plug: startup
1448802719: |-- ** Configured order: mysql

1448802719: |--  MYSQL
1448802719: Opening ipv4 listen socket on port 8880.
1448802719: Opening ipv6 listen socket on port 8880.
1448802719: Opening websockets listen socket on port 8881.
1448802719: New connection from ****** on port 8880.
1448802719: |-- mosquitto_auth_unpwd_check(******)
1448802719: |-- ** checking backend mysql
1448802719: |-- getuser(******) AUTHENTICATED=1 by mysql
1448802719: New client connected from ****** as ****** (c1, k15, u'******').
1448802719: Sending CONNACK to ****** (0, 0)

每当我尝试与 HiveMQ Websockets 客户端连接时,它都会超时...

有人可以告诉我如何实现这一目标吗?非常感谢您的帮助!

谢谢, 佩德罗。

更新:通过导入 CA 证书成功连接

我已经设法使用 Paho MQTT 客户端的 javascript 连接到蚊子!我对 mosquitto.conf 做了些微改动:

listener 8880
protocol mqtt

listener 8881
protocol websockets
cafile /home/hi/cert/ca.crt
certfile /home/hi/cert/hi.com.crt
keyfile /home/hi/cert/hi.com.key
tls_version tlsv1
#require_certificate false

我现在遇到的问题是,我只有在导入 hi.com.crt 文件并在钥匙串 (OS X) 上手动设置为“始终信任”时才能连接。由于证书是自签名的且不受 ios 信任,我无法使用我的 iPhone 登录...

默认的 mosquitto TLS 行为不应该是不需要来自客户端的证书吗?

【问题讨论】:

您在 moquitto 日志中是否收到任何错误消息或任何其他输出?你也试过 Paho websocket 客户端吗? 我一直在将 Paho MQTT 库用于 javascript,并且在尝试使用 TLS 连接时也会出现超时。我已将详细的 mosquitto 输出添加到我的原始帖子中。在我看来,mosquitto 甚至没有尝试加载证书......谢谢! hi-server 解析到什么?如果它解析为 127.0.0.1 就可以解释了 证书是使用 J-P Mens (github.com/owntracks/tools/blob/master/TLS/generate-CA.sh) 的生成器脚本生成的,因此经过快速检查,它们似乎指向 127.0.0.1。 【参考方案1】:

从 cmets 看来,hi-server 解析为 127.0.0.1/localhost。这意味着配置中的那一行

bind_address hi-server

告诉 mosquitto 只监听本地主机上的 websocket 连接,而不是任何公共接口。

将此行注释掉,然后重试

【讨论】:

请以 root 身份运行 lsof -i :8881 这将显示 mosquitto 正在监听的接口 我进步了!不过仍然有一些小问题(检查主帖子上的编辑) 这里没有客户端证书,只是让iOS信任服务器证书的情况,你应该可以导入ca.crt而不是hi.server.crt然后iOS会信任由该证书签名的所有服务器 非常感谢!那成功了。我现在可以从我的 iPhone 通过 TLS 访问 mosquitto。

以上是关于Websockets + TLS 的 Mosquitto 配置的主要内容,如果未能解决你的问题,请参考以下文章

C# - 使用 feck 的 TLS / SSL Websockets

Paho javascript 客户端 + mosquitto Websockets + Tls

在开发环境中使用 SSL/TLS 的 Rails 和 WebSockets

如何在 Play!Framework WebSockets ("wss://") 中使用 TLS

engine.io 是不是支持安全的 WebSockets wss?

MQTT Client软件-MQTTBox