EMQ配置SSL访问的一个坑

Posted encoderlee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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后终于成功连接上了

以上是关于EMQ配置SSL访问的一个坑的主要内容,如果未能解决你的问题,请参考以下文章

EMQ X 服务器 SSL/TLS 安全连接配置指南

EMQ功能使用(一) 实现MQTTS协议

物联网架构成长之路-EMQ插件配置

MQTT研究之EMQ:SSL证书链验证

EMQ ---问题集

Emq 限制匿名用户访问,开启用户密码认证