在使用Mosquitto的时候遇到了不少坑,其实对此还不是很了解,先记录下操作步骤以免忘记。
本文章只要为了实现:1、Mosquitto使用SSL自签证书单向认证后成功启动。2、Android端使用服务器证书成功连接Broker。3、Java段使用服务器证书成功连接Broker。4、使用账号密码登陆Broker并且限制主题的订阅以及发布。
此文章仅供参考,如若无法成功按照步骤来,我也有可能无能为力,因为第一次用MQTT协议开发(我是萌新),
本文章内容也是由各位互联网大大们的各种文章的集合体最终使得我成功运行,
本文章中涉及多位作者的文章的节选整合内容,而其中有可能你只需要某一位作者的内容就能成功运行,可能是我运气比较差,所以找了很多资料最终通过好几篇文章中的部分内容全部整合起来后才成功完成了运行。
前奏Mosquitto的安装
这篇文章里有安装教程(这个我没试过不敢保证)
连接地址: http://blog.csdn.net/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的使用