Mosquitto的部分使用记录(仅供参考)

本文详细介绍了使用Mosquitto实现SSL单向认证的过程,包括证书生成、配置及客户端连接验证。涵盖Linux、Java及Android端的操作步骤。

在使用Mosquitto的时候遇到了不少坑,其实对此还不是很了解,先记录下操作步骤以免忘记。

本文章只要为了实现:1、Mosquitto使用SSL自签证书单向认证后成功启动。2、Android端使用服务器证书成功连接Broker。3、Java段使用服务器证书成功连接Broker。4、使用账号密码登陆Broker并且限制主题的订阅以及发布。

此文章仅供参考,如若无法成功按照步骤来,我也有可能无能为力,因为第一次用MQTT协议开发(我是萌新),

本文章内容也是由各位互联网大大们的各种文章的集合体最终使得我成功运行,

本文章中涉及多位作者的文章的节选整合内容,而其中有可能你只需要某一位作者的内容就能成功运行,可能是我运气比较差,所以找了很多资料最终通过好几篇文章中的部分内容全部整合起来后才成功完成了运行。

前奏Mosquitto的安装

这篇文章里有安装教程(这个我没试过不敢保证) 

连接地址: http://blog.youkuaiyun.com/houjixin/article/details/24305613

请看  2、 Openssl安装与常用命令说明 部分

1.在测试阶段使用SSL自签证书实现通讯。

//一共需要完成三端的测试,Linux端,Java端,Android端。

第一步完成证书的制作,由于本项目只需要实现SSL单向认证,所以只需要制作服务器端的证书即可。

该部分内容源自: https://segmentfault.com/a/1190000005079300 和官网链接 http://mosquitto.org/man/mosquitto-tls-7.html

请看 2 Mosquito使用ssl功能的具体操作方法 部分(本链接中的部分指令缺少空格,需要自己补上,下方即补上空格后的命令)

进入Linux下产生CA的key和证书文件,命令为:

	openssl req -new -x509 -days 36500 -extensions v3_ca -keyout ca.key -out ca.crt

该命令产生ca.key和ca.crt俩个文件。这个crt就是CA自己给自己的签名证书文件(x509用于测试阶段的自签)

输入后要求填入许多的信息主要需要Common Name 这个参数,需要填写主机的IP,最终文件成功生成(注意在生成过程中设置的密码)。

接下来生成server.key密钥,命令为:

	openssl genrsa -des3 -out server.key 2048
然后使用server.key文件生成server.csr

	openssl req -out server.csr -key server.key -new
最后使用server.csr文件ca.crt文件和ca.key文件共同生成server.crt文件

	openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out sercer.crt -days 36500
同样也是需要设置信息,有了这三个文件Mosquitto就可以配置单向SLL了。

第二步将三个文件配置到Mosquitto中,打开/etc/mosquitto/mosquitto.conf文件,添加配置信息如下:

cafile /root/test/ca.crt

certfile /root/test/server.crt

keyfile /root/test/server.key

然后重启服务器,这个时候没有配置证书的客户端就无法连接了,如何测试可以使用命令

mosquitto_sub -h 10.9.254.119 -i 1111 -t “1313” -p 8883 --cafile ca.crt

连接成功的话 就OK了


 PS:2016年12月10日09:52:12 正式环境情况一般不会用CA根证书直接拿来用的,而是先自己生成server.crt和server.key(也就是上面的俩个步骤)俩个证,然后用CA.crt根证书对server.crt和server.key这俩个文件进行授权,最后cafile 中填选server.crt的路径, 然后再通过上述俩个方法生成新的server2.crt和server.key,用在certfile和keyfile俩个位置上。原因是ca根证书是拿来授权发放证书的。

2.安卓端使用服务器的server.crt成功连接Mosquitto。

本来以为很简单就能够连接上的 结果发现并不行,原因是Android无法使用该证书,所以必须将证书转换成BKS证书才行。

该部分转换证书格式内容来源自连接: http://www.jianshu.com/p/9b400e863ce3 中

Win环境下我们需要 bcprov 工具帮我们转换(http://www.bouncycastle.org/latest_releases.html)下载完成后放到 Java\jdk1.8.0_20\jre\lib\ext 目录下用cmd命令,注意目录,需要输入俩次密码:

keytool -importcert -trustcacerts -keystore e:\key.bks -file e:\server.crt -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider

这样BKS文件就成功生成了,将文件放入asset文件夹中即可。

安卓下如何使用该文件下面小提一下:

"888888"是bks文件的密码,sslFileStream是文件流,在得到SocketFactory后只要在MQTT的option中 conOptions.setSocketFactory() 这样设置一下就好了。

3.java端使用服务器server.crt文件连接Mosquitto

比较尴尬的是java端需要使用jks格式的证书才可以连接,所以也需要证书格式转换。

将证书转换成jks需要做俩步骤操作第一步是将key和crt文件转换成pkcs12格式,第二步pkcs12转换jks文件才行。

第一步:来自于连接 http://www.cnblogs.com/asingna/p/5188944.html (6.常用格式转换)

使用openssl命令(原文是pkck12你都试试我一下子忘记了,下次改回来):

openssl pkcs12 -export -out server.pfx -inkey server.key -in server.crt

将pfx改成p12后缀。

第二步:来自于连接 https://www.oschina.net/question/2266279_221175 (will qu用户的评论的第二步)

使用我们之前在java jdk下安装的工具,然后cmd命令输入:

keytool -importkeystore -v -srckeystoreserver.p12 -srcstoretype pkcs12 -srcstorepass 123456 -destkeystore server.keystore -deststoretype jks -deststorepass 123456  

成功生成后这个文件就是JKS证书了,就可以拿来java端连接Mosquitto。


最终成功完成了SSL单向认证。再此申明,该内容只是我自己成功的步骤不一定适用你的情况,但是我也要祝你成功。

本文若有错误之处,麻烦大神悉心指导,本萌新第一次接触MQTT的使用


Mosquitto 配置完成后出现连接被拒绝 (`connection refused`) 的情况,通常是由以下几个原因引起的。以下是可能的原因分析以及对应的解决方案: ### 1. **匿名访问关闭但未提供密码验证** 如果在配置文件中设置了 `allow_anonymous false`,则需要确保客户端提供了有效的用户名和密码进行身份验证[^1]。如果没有正确配置 `password_file` 或者客户端未传递正确的认证信息,则会出现连接被拒的现象。 #### 解决方案: - 确认密码文件路径是否正确无误,并且该文件已成功创建并填充了用户数据。 - 使用以下命令生成密码文件(假设目标存储位置为 `/etc/mosquitto/passwd`): ```bash sudo mosquitto_passwd -c /etc/mosquitto/passwd your_username ``` 在此过程中会被提示输入两次密码以完成用户的添加操作。 ### 2. **监听端口未启用或绑定错误** 默认情况下,Mosquitto 可能仅监听本地地址或者特定IP地址而非全局接口(`0.0.0.0`)。这可能导致外部尝试建立TCP/IP层面上的链接失败。 #### 解决方案: 检查配置文件是否有类似下面这样的行来指定侦听的所有网络接口上的某个端口号(比如标准MQTT协议使用的1883端口卡): ```plaintext listener 1883 0.0.0.0 ``` 如果没有显式声明以上内容的话,请将其加入到您的自定义子目录下的配置片段里去,例如 `/etc/mosquitto/conf.d/default.conf` 中。 ### 3. **防火墙阻止了必要的通信流量** 即使服务器本身已经准备好接受来自外界的消息请求,但如果操作系统层面存在活跃状态的安全防护机制如iptables/ufw等,则仍有可能因为缺乏适当规则而阻挡掉这些包交换活动。 #### 解决方案: 允许通过 UFW(Uncomplicated Firewall) 放开 MQTT 所需端口的数据流通路经为例说明如下步骤执行顺序: ```bash sudo ufw allow 1883/tcp sudo ufw reload ``` 另外还需注意的是,某些云服务商可能会额外施加实例级别的网络安全组策略限制条件同样也需要同步调整开放相应范围内的出入方向权限才行[^2]。 ### 4. **服务未能正常启动或崩溃** 最后一种可能性就是尽管完成了上述各项准备工作之后仍然无法正常使用是因为 broker 自身存在问题从而导致其根本就没有处于运行当中或者是中途意外终止掉了的缘故所致。 #### 排查手段: 查看日志记录了解具体情况可以帮助定位问题所在之处。可以查阅位于/var/log/ 下面的相关日记条目获取更多信息;亦或是直接利用systemd管理工具查询最近一段时间以来的状态变更历史详情作为辅助判断依据之一 : ```bash journalctl -u mosquitto.service --since today ``` --- ### 提供一段简单的测试脚本以便快速验证基本连通状况 为了方便排查具体哪个环节出了差错这里给出一个基于 Python 的 paho-mqtt 库编写的简易版发布订阅程序例子供大家参考学习之用: ```python import paho.mqtt.client as mqtt def on_connect(client, userdata, flags, rc): if rc==0: print("connected OK Returned code=",rc) else: print("Bad connection Returned code= ",rc) broker="your_broker_ip" port=1883 client = mqtt.Client() client.on_connect = on_connect client.username_pw_set(username="your_username",password="your_password") # 如果启用了鉴权才需要用到这一句 try: client.connect(broker,port) except Exception as e: print(f'Connection error:{e}') client.loop_forever() ```
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值