关于mqtt:EMQ-X-MQTT-服务器启用双向-SSLTLS-安全连接

78次阅读

共计 3972 个字符,预计需要花费 10 分钟才能阅读完成。

作为基于古代密码学公钥算法的平安协定,TLS/SSL 能在计算机通信网络上保障传输平安,EMQ X 内置对 TLS/SSL 的反对,包含反对单 / 双向认证、X.509 证书、负载平衡 SSL 等多种平安认证。你能够为 EMQ X 反对的所有协定启用 SSL/TLS,也能够将 EMQ X 提供的 HTTP API 配置为应用 TLS。

在上一片篇文章中,咱们曾经介绍过如何为 EMQ X MQTT 服务器启用 SSL/TLS 单向平安连贯,本文将介绍如何在 EMQ X 中为 MQTT 启用双向 SSL/TLS 平安连贯。

SSL/TLS 带来的平安劣势

  • 强认证。 用 TLS 建设连贯的时候,通信单方能够相互查看对方的身份。在实践中,很常见的一种身份查看形式是查看对方持有的 X.509 数字证书。这样的数字证书通常是由一个受信机构颁发的,不可伪造。
  • 保障机密性 。TLS 通信的每次会话都会由会话密钥加密,会话密钥由通信单方协商产生。任何第三方都无奈通晓通信内容。即便一次会话的密钥泄露,并不影响其余会话的安全性。
  • 完整性。 加密通信中的数据很难被篡改而不被发现。

SSL/TLS 协定

TLS/SSL 协定下的通信过程分为两局部,第一局部是握手协定。握手协定的目标是甄别对方身份并建设一个平安的通信通道。握手实现之后单方会协商出接下来应用的明码套件和会话密钥;第二局部是 record 协定,record 和其余数据传输协定十分相似,会携带内容类型,版本,长度和荷载等信息,不同的是它所携带的信息是加密了的。

上面的图片形容了 TLS/SSL 握手协定的过程,从客户端的 “hello” 始终到服务器的 “finished” 实现握手。有趣味的同学能够找更具体的材料看。对这个过程不理解也并不影响咱们在 EMQ X 中启用这个性能。

为什么须要 SSL/TLS 双向认证

双向认证是指,在进行通信认证时要求服务端和客户端都须要证书,单方都要进行身份认证,以确保通信中波及的单方都是受信赖的。单方彼此共享其公共证书,而后基于该证书执行验证、确认。一些对安全性要求较高的利用场景,就须要开启双向 SSL/TLS 认证。

SSL/TLS 证书筹备

在双向认证中,个别都应用自签名证书的形式来生成服务端和客户端证书,因而本文就以自签名证书为例。

通常来说,咱们须要数字证书来保障 TLS 通信的强认证。数字证书的应用自身是一个三方协定,除了通信单方,还有一个颁发证书的受信第三方,有时候这个受信第三方就是一个 CA。和 CA 的通信,个别是以事后发行证书的形式进行的。也就是在开始 TLS 通信的时候,咱们须要至多有 2 个证书,一个 CA 的,一个 EMQ X 的,EMQ X 的证书由 CA 颁发,并用 CA 的证书验证。

在这里,咱们假如您的零碎曾经装置了 OpenSSL。应用 OpenSSL 附带的工具集就能够生成咱们须要的证书了。

生成自签名 CA 证书

首先,咱们须要一个自签名的 CA 证书。生成这个证书须要有一个私钥为它签名,能够执行以下命令来生成私钥:

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 文件,

  • req_distinguished_name:依据状况进行批改,
  • alt_names:BROKER_ADDRESS 批改为 EMQ X 服务器理论的 IP 或 DNS 地址,例如:IP.1 = 127.0.0.1,或 DNS.1 = broker.xxx.com

    留神:IP 和 DNS 二者保留其一即可,如果已购买域名,只需保留 DNS 并批改为你所应用的域名地址。

[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 = CA
[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

生成客户端证书

双向连贯认证还须要创立客户端证书,首先须要创立客户端密钥:

openssl genrsa -out client.key 2048

应用生成的客户端密钥来创立一个客户端申请文件:

openssl req -new -key client.key -out client.csr -subj "/C=CN/ST=Zhejiang/L=Hangzhou/O=EMQX/CN=client"

最初应用先前生成好的服务端 CA 证书来给客户端签名,生成一个客户端证书:

openssl x509 -req -days 3650 -in client.csr -CA my_root_ca.pem -CAkey my_root_ca.key -CAcreateserial -out client.pem

筹备好服务端和客户端证书后,咱们就能够在 EMQ X 中启用 TLS/SSL 双向认证性能。

SSL/TLS 双向连贯的启用及验证

在 EMQ X 中 mqtt:ssl 的默认监听端口为 8883。

EMQ X 配置

将前文中通过 OpenSSL 工具生成的 emqx.pememqx.keymy_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

## A server only does x509-path validation in mode verify_peer,
## as it then sends a certificate request to the client (this
## message is not sent if the verify option is verify_none).
##
## Value: verify_peer | verify_none
listener.ssl.external.verify = verify_peer

MQTT 连贯测试

当配置实现并重启 EMQ X 后,咱们应用 MQTT 客户端工具 – MQTT X(该工具跨平台且反对 MQTT 5.0),来验证 TLS 双向认证服务是否失常运行。

MQTT X 版本要求:v1.3.2 及以上版本

  • 参照下图在 MQTT X 中创立 MQTT 客户端 (Host 输入框里的 127.0.0.1 需替换为理论的 EMQ X 服务器 IP)

    此时 Certificate 一栏须要抉择 Self signed,并携带自签名证书中生成的 my_root_ca.pem 文件,客户端证书 client.pem 和客户端密钥 client.key 文件。

  • 点击 Connect 按钮,连贯胜利后,如果能失常执行 MQTT 公布 / 订阅 操作,则 SSL 双向连贯认证配置胜利。

EMQ X Dashboard 验证

最初,关上 EMQ X 的 Dashboard 在 Listeners 页面能够看到在 8883 端口上有一个 mqtt:ssl 连贯。

至此,咱们胜利的实现了 EMQ X 服务器的 SSL/TLS 配置及双向认证连贯测试。

版权申明:本文为 EMQ 原创,转载请注明出处。

原文链接:https://www.emqx.io/cn/blog/e…

正文完
 0