做为基于现代密码学公钥算法的安全协议,TLS/SSL 能在计算机通信网络上保证传输安全,EMQ X 内置对 TLS/SSL 的支持,包括支持单/双向认证、X.509 证书、负载均衡 SSL 等多种安全认证。你能够为 EMQ X 支持的全部协议启用 SSL/TLS,也能够将 EMQ X 提供的 HTTP API 配置为使用 TLS。本文将介绍如何在 EMQ X 中为 MQTT 启用 TLS。node
TLS/SSL 协议下的通信过程分为两部分,第一部分是握手协议。握手协议的目的是鉴别对方身份并创建一个安全的通信通道。握手完成以后双方会协商出接下来使用的密码套件和会话密钥;第二部分是 record 协议,record 和其余数据传输协议很是相似,会携带内容类型,版本,长度和荷载等信息,不一样的是它所携带的信息是加密了的。算法
下面的图片描述了 TLS/SSL 握手协议的过程,从客户端的 "hello" 一直到服务器的 "finished" 完成握手。有兴趣的同窗能够找更详细的资料看。对这个过程不了解也并不影响咱们在 EMQ X 中启用这个功能。shell
一般来讲,咱们会须要数字证书来保证 TLS 通信的强认证。数字证书的使用自己是一个三方协议,除了通信双方,还有一个颁发证书的受信第三方,有时候这个受信第三方就是一个 CA。和 CA 的通信,通常是以预先发行证书的方式进行的。也就是在开始 TLS 通信的时候,咱们须要至少有 2 个证书,一个 CA 的,一个 EMQ X 的,EMQ X 的证书由 CA 颁发,并用 CA 的证书验证。安全
得到一个真正受外界信任的证书须要到证书服务提供商进行购买。在实验室环境,咱们也能够用本身生成的证书来模拟这个过程。下面咱们分别以这两种方式来讲明 EMQ X 服务器的 SSL/TLS 启用过程。服务器
注意: 购买证书与自签名证书的配置,读者根据自身状况只需选择其中一种进行测试。
若是有购买证书的话,就不须要自签名证书。网络
为方便 EMQ X 配置,请将购买的证书文件重命名为 emqx.crt
,证书密钥重命名为 emqx.key
。app
在这里,咱们假设您的系统已经安装了 OpenSSL。使用 OpenSSL 附带的工具集就能够生成咱们须要的证书了。负载均衡
首先,咱们须要一个自签名的 CA 证书。生成这个证书须要有一个私钥为它签名,能够执行如下命令来生成私钥:ide
openssl genrsa -out my_root_ca.key 2048
这个命令将生成一个密钥长度为 2048 的密钥并保存在 my_root_ca.key
中。有了这个密钥,就能够用它来生成 EMQ X 的根证书了:工具
openssl req -x509 -new -nodes -key my_root_ca.key -sha256 -days 3650 -out my_root_ca.pem
根证书是整个信任链的起点,若是一个证书的每一级签发者向上一直到根证书都是可信的,那个咱们就能够认为这个证书也是可信的。有了这个根证书,咱们就能够用它来给其余实体签发实体证书了。
实体(在这里指的是 EMQ X)也须要一个本身的私钥对来保证它对本身证书的控制权。生成这个密钥的过程和上面相似:
openssl genrsa -out emqx.key 2048
新建 openssl.cnf
文件,
BROKER_ADDRESS
修改成 EMQ X 服务器实际的 IP 或 DNS 地址,例如:IP.1 = 127.0.0.1,或 DNS.1 = broker.xxx.com[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 = Zhejiang localityName = Hangzhou organizationName = EMQX commonName = Server certificate [req_ext] subjectAltName = @alt_names [v3_req] subjectAltName = @alt_names [alt_names] IP.1 = BROKER_ADDRESS DNS.1 = BROKER_ADDRESS
而后以这个密钥和配置签发一个证书请求:
openssl req -new -key ./emqx.key -config openssl.cnf -out emqx.csr
而后以根证书来签发 EMQ X 的实体证书:
openssl x509 -req -in ./emqx.csr -CA my_root_ca.pem -CAkey my_root_ca.key -CAcreateserial -out emqx.pem -days 3650 -sha256 -extensions v3_req -extfile openssl.cnf
准备好证书后,咱们就能够启用 EMQ X 的 TLS/SSL 功能了。
在 EMQ X 中 mqtt:ssl
的默认监听端口为 8883。
将前文重命名后的 emqx.key
文件及 emqx.crt
文件拷贝到 EMQ X 的 etc/certs/
目录下,并参考以下配置修改 emqx.conf
:
## listener.ssl.$name is the IP address and port that the MQTT/SSL ## Value: IP:Port | Port listener.ssl.external = 8883 ## Path to the file containing the user's private PEM-encoded key. ## Value: File listener.ssl.external.keyfile = etc/certs/emqx.key ## Path to a file containing the user certificate. ## Value: File listener.ssl.external.certfile = etc/certs/emqx.crt
当配置完成并重启 EMQ X 后,咱们使用 MQTT 客户端工具 - MQTT X(该工具跨平台且支持 MQTT 5.0),来验证 TLS 服务是否正常运行。
MQTT X 版本要求:v1.3.2 及以上版本
MQTT 客户端
(Host 输入框里的 mqttx.app
需替换为实际的域名)注意:在 Certificate
一栏只需选择 CA signed server
便可,使用购买证书在进行单向认证链接时不须要携带任何证书文件(CA 文件也不须要携带)。
Connect
按钮,链接成功后,若是能正常执行 MQTT 发布/订阅 操做,则购买证书的 SSL 单向认证配置成功。将前文中经过 OpenSSL 工具生成的 emqx.pem
、emqx.key
及 my_root_ca.pem
文件拷贝到 EMQ X 的 etc/certs/
目录下,并参考以下配置修改 emqx.conf
:
## listener.ssl.$name is the IP address and port that the MQTT/SSL ## Value: IP:Port | Port listener.ssl.external = 8883 ## Path to the file containing the user's private PEM-encoded key. ## Value: File listener.ssl.external.keyfile = etc/certs/emqx.key ## Path to a file containing the user certificate. ## Value: File listener.ssl.external.certfile = etc/certs/emqx.pem ## Path to the file containing PEM-encoded CA certificates. The CA certificates ## Value: File listener.ssl.external.cacertfile = etc/certs/my_root_ca.pem
当配置完成并重启 EMQ X 后,咱们使用 MQTT 客户端工具 - MQTT X(该工具跨平台且支持 MQTT 5.0),来验证 TLS 服务是否正常运行。
MQTT X 版本要求:v1.3.2 及以上版本
MQTT 客户端
(Host 输入框里的 127.0.0.1
需替换为实际的 EMQ X 服务器 IP)此时 Certificate
一栏须要选择 Self signed
,并携带自签名证书中生成的 my_root_ca.pem
文件。
Connect
按钮,链接成功后,若是能正常执行 MQTT 发布/订阅 操做,则自签名证书的 SSL 单向认证配置成功。最后,打开 EMQ X 的 Dashboard 在 Listeners 页面能够看到在 8883 端口上有一个 mqtt:ssl
链接。
至此,咱们成功的完成了 EMQ X 服务器的 SSL/TLS 配置及单向认证链接测试。EMQ X SSL/TLS 双向认证配置文档请关注咱们的后续文章。
版权声明: 本文为 EMQ 原创,转载请注明出处。