EMQ配置SSL访问的一个坑

抉择

最近在做android方面的项目,需要用到mqtt,一开始使用超轻量的mosquitto,后来发现权限配置和集群配置比较麻烦,于是决定重新选用一款重一点的mqtt broker,看来看去看中了国产的EMQ http://www.emqtt.com 看功能介绍,那是相当的强大,全中文文档看起来也非常容易,二话不说下载安装试用,还自带WEB后台,相当舒服,于是准备在产品服务器上部署

踩坑

安装部署配置一切都顺利,下载deb包dpkg -i 安装就可以了,产品服务器,通信加密是必须的,于是配置SSL,从8883端口访问emq。
根据官方文档说明配置SSL证书http://www.emqtt.com/docs/v2/config.html#mqtt-ssl-8883

## SSL Options
listener.ssl.external.handshake_timeout = 15
listener.ssl.external.keyfile = etc/certs/key.pem
listener.ssl.external.certfile = etc/certs/cert.pem
## 开启双向认证
## listener.ssl.external.cacertfile = etc/certs/cacert.pem
## listener.ssl.external.verify = verify_peer
## listener.ssl.external.fail_if_no_peer_cert = true

我并不需要双向验证,所以根据说明,只配置了listener.ssl.external.keyfile和listener.ssl.external.certfile两个参数

listener.ssl.external.keyfile = etc/certs/xxx.com.key
listener.ssl.external.certfile = etc/certs/xxx.com.crt

分别指向了SSL证书和私钥文件,SSL证书和私钥是放在nginx一直在用的,不会有什么问题,配置后重启emq
sudo systemctl restart emqttd
尝试使用域名从8883端口访问,结果客户端抛出异常,emq服务端错误日志显示
SSL: certify: ssl_alert.erl:88:Fatal error: certificate unknown
开始还以为是证书格式不对,使用openssl进行了各种转换,依旧是这个错误,以此为关键词在网上搜索也找不到什么有用的信息

脱坑

一开始就想会不会是listener.ssl.external.cacertfile这个参数没有配置,因为文档里说要开双向验证才需要配置,另一方面我的SSL证书是花钱买的,并非自签证书,那么CA证书应该是ubuntu系统已经预置了,配置nginx之类的其它服务端,也没有遇到需要配置CA证书的情况(自签证书除外),所以一直没有去碰这个参数,最后搞了大半天才发现是这参数的问题
emq并不会自己去系统里面找CA证书,一定要手动配置才行,关键是文档里也没具体说明这一点,网上的例子也是只配置了listener.ssl.external.keyfile和listener.ssl.external.certfile这两个参数
由于我的证书文件xxx.com.crt内已经包含包括CA在内的证书链,所以这样配置即可

listener.ssl.external.keyfile = etc/certs/xxx.com.key
listener.ssl.external.certfile = etc/certs/xxx.com.crt
listener.ssl.external.cacertfile =etc/certs/xxx.com.crt

即listener.ssl.external.certfile和listener.ssl.external.cacertfile指向同一个文件
sudo systemctl restart emqttd后终于成功连接上了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章