emqx是一种基于mqtt协议实现的消息框架,目前很多地方已经开始使用。简单的emqx安装配置,其实就可以作为一个broker来使用,客户端只需要通过ip、端口、用户名、密码、clientid就可以连接了,至于发送消息,直接在发送的时候指定topic即可。
简单的emqx安装配置,使用的协议是:mqtt:tcp,使用的url是tcp://ip:1883。这种方式,其实可以很容易被模拟(理论上的可能),所以有了mqtts:tls协议,一般使用ssl协议来实现。这也是本文所要阐述的问题。
我在配置ssl证书的时候,服务启动没问题,最后客户端连接,死活连接失败。最后看了官方的文档,按照那个文档很容易就配置成功,并且客户端连接也成功了。
其实我大概知道我配置失败的原因,可能是因为证书中的一个跟主机ip相关的设置问题,但是这个问题我按照一些博客的提示做了修改,但是后来还是没有成功,很郁闷,最后按照官方配置,很快设置好了。思路基本一模一样,而且配置证书的步骤也都类似,先生成私钥,然后生成证书请求,最后根据根证书生成服务端证书和客户端证书。
emqx的下载安装这里不做过多的说明,在官网直接下载,解压然后运行bin/emqx start就可以了。
emqx安装目录下有一个etc/certs目录,它自带了一些根证书、服务端证书、客户端证书,但是为了保险起见,最好自己根据自己的主机地址生成。
下面基本是按照emqx官方的一篇博客来配置的,就是主机地址做了修改。
以下的证书配置,是自签名证书,不是花钱购买的那种服务器证书。
1、生成根证书私钥
openssl genrsa -out ca.key 2048
2、生成根证书
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.pem
这一步会有交互提示,需要输入省份、城市、公司、组织、姓名、右键,随便填写就可以,这里的信息不会影响根证书使用。
3、生成服务端证书私钥
openssl genrsa -out emqx.key 2048
4、生成服务端证书请求
按照官方博客的意思,这里需要手动创建一个openssl.cnf的文件,其实主要就是设置IP地址
[req]
default_bits = 2048
distinguished_name = req_distinguished_name
req_extensions = req_ext
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
countryName = CN
stateOrProvinceName = Hubei
localityName = Wuhan
organizationName = EMQX
commonName = CA
[req_ext]
subjectAltName = @alt_names
[v3_req]
subjectAltName = @alt_names
[alt_names]
IP.1 = 192.168.226.100
DNS.1 = 192.168.226.100
如果你的服务器是虚拟机,只需要修改IP.1的值即可。
执行如下命令生成服务端证书请求:
openssl req -new -key ./emqx.key -config openssl.cnf -out emqx.csr
私钥的生成,就使用了openssl.cnf配置文件 ,所以我之前的配置失败,应该是这里的IP设置问题。但是我确实根据某些博客的提示,设置subj "/CN=192.168.226.100",但是不生效。
5、生成服务端证书
openssl x509 -req -in ./emqx.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out emqx.pem -days 3650 -sha256 -extensions v3_req -extfile openssl.cnf
6、生成客户端证书私钥
openss