1、生成ca的key和证书
openssl genrsa -out MyRootCA.key 2048
openssl req -x509 -new -nodes -key MyRootCA.key -sha256 -days 3650 -out MyRootCA.pem
2、生成服务器所需key和证书
openssl genrsa -out MyEMQ1.key 2048
openssl req -new -key ./MyEMQ1.key -out MyEMQ1.csr
openssl x509 -req -in ./MyEMQ1.csr -CA MyRootCA.pem -CAkey MyRootCA.key -CAcreateserial -out MyEMQ1.pem -days 3650 -sha256
3、在emqtt的配置文件,我的debian 是在/etc/emqttd/emq.conf,其他系统自行查找
vim中查找:/listener.ssl.external.keyfile,设置如下
#private key for emq cert: listener.ssl.external.keyfile = etc/certs/MyEMQ1.key
#emq cert: listener.ssl.external.certfile = etc/certs/MyEMQ1.pem
#CA cert: listener.ssl.external.cacertfile = etc/certs/MyRootCA.pem
4、将MyRootCA.pem复制到模块demo的mqtt文件夹下
修改mqttTask.lua
task方法内添加,这里是为了防止模块时间不在证书有效期内,这里的时间只是为了方便修改,真实环境请以ntp时间为准,观察证书有效期。
misc.setClock({year=2019,month=2,day=14,hour=14,min=2,sec=58}) sys.wait(2000) local tm = misc.getClock() log.info("testNtp.printTime",tm.year,tm.month,tm.day,tm.hour,tm.min,tm.sec)
修改connect
if mqttClient:connect("0.tcp.ngrok.io",15514,"tcp_ssl",{caCert="MyRootCA.crt"})then
至此即可进行emqtt的ssl连接
补充,luat需要证书为crt格式,而刚才生成代码的证书是pem,两者都是base64加密,内容无区别,故后缀名直接更改为crt即可,服务器端无需更改
参考链接
https://medium.com/@emqtt/securing-emq-connections-with-ssl-432672ab9f06