我在Debian 9上安装了mosquitto
apt-get install mosquitto mosquitto-clients
做了重新开始 服务蚊子重启
测试了它
mosquitto_pub -d -t My/Topic2 -m "Hello MQTT"
没有错误消息
创建了密码
mosquitto_passwd -c /etc/mosquitto/passwd myUsername
创建了一个aclfile
touch /etc/mosquitto/aclfile
nano /etc/mosquitto/aclfile
有了这个内容:
# This affects access control for clients with no username.
topic read myTopic/#
# This only affects clients with username "myUsername".
user myUsername
topic myTopic/#
# This affects all clients.
pattern write $SYS/broker/connection/%c/state
将acl_file的路径插入此文件
nano /etc/mosquitto/mosquitto.conf
acl_file /etc/mosquitto/aclfile
password_file /etc/mosquitto/passwd
所以计划是用户“myUsername”可以在“myTopic”中发布,而包括访客在内的所有其他用户只能阅读。
我已经在其他服务器上运行了此配置,但在这种情况下出现了问题 我第一次测试时忘了将password_file路径添加到mosquitto.conf中 并得到错误:连接被拒绝,如果我想这样发布 如果我只想订阅
好的我解决了这个问题,但现在我可以在没有用户名/密码的情况下发布
和corse我做了重启:
service mosquitto restart
所以,如果我发送
mosquitto_pub -d -t myTopic/test -m "Access denied is expected"
我没有得到错误,看起来像是发布了消息
如果我打开第二个shell(也来自远程机器) 我可以订阅
mosquitto_sub -d -t myTopic/test
但是如果我在这个主题上发布了一些内容,那么就没有收到任何内容(Ping正在运行)
我的2个问题的任何想法?
PS:我不是Linux专业人士 所以,如果您想了解更多信息,请向我提供如何获取此信息的正确信息编辑:如果我使用
ps -efc
这是mosquitto的唯一条目
mosquit+ 736 1 TS 19 21:36 ? 00:00:02 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf
在日志中
nano /var/log/mosquitto/mosquitto.log
我得到了
ACL denying access to client with dangerous client id "mosqpub/7977-Debian-93-"
ACL denying access to client with dangerous client id "mosqpub/356-h2700629"
但是关于谷歌,这应该已经在去年修复了
我正在使用mosquitto版本1.4.10
答案 0 :(得分:0)
如果不允许用户发布主题,则发布将无声地失败。这是为MQTT设计的(至少在MQTT v3.x上)。
如果您想阻止未传递用户名/密码的客户端,您可能还需要添加allow_anonymous false
。
要获取最新版本的mosquitto,请按照https://mosquitto.org/download/上的说明安装正确的ppa
答案 1 :(得分:0)
遇到同样的问题,发现是关于用户名/客户端 ID 中的 /
。来自https://github.com/eclipse/mosquitto/blob/5c45bc4e8407d94d29b39152b580d2b4cc8082e9/src/security.c#L609-L610:
/* Check whether the client id or username contains a +, # or / and if
* so deny access.
删除“/”使其再次工作。