用Openssl生成私钥或者其他证书认证时,经常弹出can't open openssl.cnf之类的错误,首先在openssl的安装目录里查看是否有.cnf文件,如果没有需要重新安装,一般openssl有完整版和轻量级版两种,完整版有openssl.cnf文件,安装完整版完毕后在系统环境变量里新建一个OPENSSL_CONF,值为openssl.cnf的完整路径和名称,比如C:\Program Files\OpenSSL-Win64\bin\cnf\openssl.cnf。点击确定后,必须重新启动才有效。
用openssl生成csr文件时,Common Name一定要输入本地IP地址或主机名称。配置mosquitto.conf时,先停止mosquitto服务,在mosquitto.conf文件末尾添加:
# MQTT over TLS
listener 8883
cafile C:\Program Files\mosquitto\certificates\ca.crt
certfile C:\Program Files\mosquitto\certificates\server.crt
keyfile C:\Program Files\mosquitto\certificates\server.key
#表示注释,路径以mosquitto的实际安装路径为准,certificates子文件夹是手动在mosquitto文件夹里新建的,3个文件是先用openssl文件生成然后拷进来的。
以上文件的生成步骤如下:
1.生成根私钥,最重要的,一定要保密,因为只要有这个文件就可以生成证书
openssl genrsa -out ca.key 2048
2.生成自签名证书
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt
3.新建一个私钥
openssl genrsa -out server.key 2048
4.新建一个由私钥创建公钥的请求
openssl req -new -key server.key -out server.csr
5.生成公钥文件
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 3650
以上步骤都是先建一个目录,然后命令行cd进入目录后,再命令行输入以上命令。
然后订阅和发布输入相应的命令行即可:如订阅命令行如下:
mosquitto_sub -h 192.168.43.78 -V mqttv311 -p 8883 --cafile C:\Progra~1\mosquitto\certificates\ca.crt -t sensors/octocopter01/altitude -d
以上是无需客户端提供证书的情况。
如果需要客户端提供证书,那么需要在mosquitto.conf结尾处再添加以下一行,然后重启服务:
require_certificate true
然后生成客户端的密钥和证书:
1.openssl genrsa -out client1.key 2048
2.openssl req -new -key client1.key -out client1.csr
3.openssl x509 -req -in client1.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client1.crt -days 3650
然后输入订阅命令:
mosquitto_sub -h 192.168.1.1 -V mqttv311 -p 8883 --cafile ca.crt --cert client1.crt --key client1.key
需要注意的是:
1.以上文件需要的是完整完整路径,windows命令行识别不了空格,所以Program Files改成Progra~1。
2.上面的Common Name如果是IP地址,那么用mosquitto的命令行以及MQTT.fx连接通信都没问题,但是如果用python 3.7及以上版本的都不行,其生成认证文件时Common Name必须是主机名。或者补救如下:
3.以上的ca.crt相当于CA机构颁发的证书,ca.key相当于证书的私钥,server.crt和client1.crt分别相当于既包含一些各端设备信息又包括各自公钥的文件,server.key和client1.key相当于服务器和客户端各自的私钥文件。