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