EMQX MQTT 服务器启用 SSL/TLS 安全连接,利用8883端口

打印 上一主题 下一主题

主题 708|帖子 708|积分 2124

1.提前下载安装openssl

2.新建openssl文件夹打开在命令行利用

3.按照下面的利用举行


MQTT 安全


作为基于现代暗码学公钥算法的安全协议,TLS/SSL 能在计算机通讯网络上包管传输安全,EMQX 内置对 TLS/SSL 的支持,包罗支持单/双向认证、X.509 证书、负载平衡 SSL 等多种安全认证。你可以为 EMQX 支持的全部协议启用 SSL/TLS,也可以将 EMQX 提供的 HTTP API 配置为利用 TLS。本文将先容怎样在 EMQX 中为 MQTT 启用 TLS。
SSL/TLS 带来的安全优势



  • 强认证。 用 TLS 创建连接的时候,通讯双方可以互相检查对方的身份。在实践中,很常见的一种身份检查方式是检查对方持有的 X.509 数字证书。这样的数字证书通常是由一个受信机构颁发的,不可伪造。
  • 包管机密性。TLS 通讯的每次会话都会由会话密钥加密,会话密钥由通讯双方协商产生。任何第三方都无法知晓通讯内容。即使一次会话的密钥泄露,并不影响其他会话的安全性。
  • 完整性。 加密通讯中的数据很难被窜改而不被发现。
SSL/TLS 协议

TLS/SSL 协议下的通讯过程分为两部门,第一部门是握手协议。握手协议的目的是鉴别对方身份并创建一个安全的通讯通道。握手完成之后双方会协商出接下来利用的暗码套件和会话密钥;第二部门是 record 协议,record 和其他数据传输协议非常类似,会携带内容类型,版本,长度和荷载等信息,不同的是它所携带的信息是加密了的。
下面的图片描述了 TLS/SSL 握手协议的过程,从客户端的 "hello" 不停到服务器的 "finished" 完成握手。有兴趣的同学可以找更详细的资料看。对这个过程不相识也并不影响我们在 EMQX 中启用这个功能。


SSL/TLS 证书准备

通常来说,我们会需要数字证书来包管 TLS 通讯的强认证。数字证书的利用本身是一个三方协议,除了通讯双方,还有一个颁发证书的受信第三方,有时候这个受信第三方就是一个 CA。和 CA 的通讯,一般是以预先发行证书的方式举行的。也就是在开始 TLS 通讯的时候,我们需要至少有 2 个证书,一个 CA 的,一个 EMQX 的,EMQX 的证书由 CA 颁发,并用 CA 的证书验证。
得到一个真正受外界信托的证书需要到证书服务提供商举行购买。在实行室环境,我们也可以用自己生成的证书来模拟这个过程。下面我们分别以这两种方式来分析 EMQX 服务器的 SSL/TLS 启用过程。
   留意: 购买证书与自署名证书的配置,读者根据自身环境只需选择此中一种举行测试。
  购买证书

假如有购买证书的话,就不需要自署名证书。
为方便 EMQX 配置,请将购买的证书文件重命名为 emqx.crt,证书密钥重命名为 emqx.key。
自署名证书

在这里,我们假设您的体系已经安装了 OpenSSL。利用 OpenSSL 附带的工具集就可以生成我们需要的证书了。
首先,我们需要一个自署名的 CA 证书。生成这个证书需要有一个私钥为它署名,可以执行以下命令来生成私钥:
  1. openssl genrsa -out ca.key 2048
复制代码
这个命令将生成一个密钥长度为 2048 的密钥并保存在 ca.key 中。有了这个密钥,就可以用它来生成 EMQX 的根证书了:
  1. openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.pem
复制代码
检察 CA 证书信息(可选):
  1. openssl x509 -in ca.pem -noout -text
复制代码
根证书是整个信托链的起点,假如一个证书的每一级签发者向上不停到根证书都是可信的,那个我们就可以以为这个证书也是可信的。有了这个根证书,我们就可以用它来给其他实体签发实体证书了。
实体(在这里指的是 EMQX)也需要一个自己的私钥对来包管它对自己证书的控制权。生成这个密钥的过程和上面类似:
  1. openssl genrsa -out emqx.key 2048
复制代码
新建 openssl.cnf 文件,


  • req_distinguished_name :根据环境举行修改,
  • alt_names: BROKER_ADDRESS 修改为 EMQX 服务器实际的 IP 或 DNS 地点,比方:IP.1 = 127.0.0.1,或 DNS.1 = broker.xxx.com
  1. [req]
  2. default_bits  = 2048
  3. distinguished_name = req_distinguished_name
  4. req_extensions = req_ext
  5. x509_extensions = v3_req
  6. prompt = no
  7. [req_distinguished_name]
  8. countryName = CN
  9. stateOrProvinceName = Zhejiang
  10. localityName = Hangzhou
  11. organizationName = EMQX
  12. commonName = Server certificate
  13. [req_ext]
  14. subjectAltName = @alt_names
  15. [v3_req]
  16. subjectAltName = @alt_names
  17. [alt_names]
  18. IP.1 = BROKER_ADDRESS
  19. DNS.1 = BROKER_ADDRESS
复制代码
然后以这个密钥和配置签发一个证书请求:
  1. openssl req -new -key ./emqx.key -config openssl.cnf -out emqx.csr
复制代码
然后以根证书来签发 EMQX 的实体证书:
  1. 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
复制代码
检察 EMQX 实体证书(可选):
  1. openssl x509 -in emqx.pem -noout -text
复制代码
验证 EMQX 实体证书,确定证书是否正确:
  1. $ openssl verify -CAfile ca.pem emqx.pem
  2. emqx.pem: OK
复制代码
准备好证书后,我们就可以启用 EMQX 的 TLS/SSL 功能了。
SSL/TLS 启用及验证

在 EMQX 中 mqtt:ssl 的默认监听端口为 8883。
购买证书方式

EMQX 配置

将前文重命名后的 emqx.key 文件及 emqx.crt 文件拷贝到 EMQX 的 etc/certs/ 目次下,并参考如下配置修改 emqx.conf:
  1. ## listener.ssl.$name is the IP address and port that the MQTT/SSL
  2. ## Value: IP:Port | Port
  3. listener.ssl.external = 8883
  4. ## Path to the file containing the user's private PEM-encoded key.
  5. ## Value: File
  6. listener.ssl.external.keyfile = etc/certs/emqx.key
  7. ## 注意:如果 emqx.crt 是证书链,请确保第一个证书是服务器的证书,而不是 CA 证书。
  8. ## Path to a file containing the user certificate.
  9. ## Value: File
  10. listener.ssl.external.certfile = etc/certs/emqx.crt
复制代码
MQTT 连接测试

当配置完成并重启 EMQX 后,我们利用 MQTT 客户端工具 - MQTTX(该工具跨平台且支持 MQTT 5.0),来验证 TLS 服务是否正常运行。
   MQTTX 版本要求:v1.3.2 及以上版本
  

  • 参照下图在 MQTTX 中创建 MQTT 客户端(Host 输入框里的 mqttx.app 需替换为实际的域名)


留意:在 Certificate 一栏只需选择 CA signed server 即可,利用购买证书在举行单向认证连接时不需要携带任何证书文件(CA 文件也不需要携带)。


  • 点击 Connect 按钮,连接乐成后,假如能正常执行 MQTT 发布/订阅 利用,则购买证书的 SSL 单向认证配置乐成。


自署名证书方式

EMQX 配置

将前文中通过 OpenSSL 工具生成的 emqx.pem、emqx.key 及 ca.pem 文件拷贝到 EMQX 的 etc/certs/ 目次下,并参考如下配置修改 emqx.conf:
  1. ## listener.ssl.$name is the IP address and port that the MQTT/SSL
  2. ## Value: IP:Port | Port
  3. listener.ssl.external = 8883
  4. ## Path to the file containing the user's private PEM-encoded key.
  5. ## Value: File
  6. listener.ssl.external.keyfile = etc/certs/emqx.key
  7. ## 注意:如果 emqx.pem 是证书链,请确保第一个证书是服务器的证书,而不是 CA 证书。
  8. ## Path to a file containing the user certificate.
  9. ## Value: File
  10. listener.ssl.external.certfile = etc/certs/emqx.pem
  11. ## 注意:ca.pem 用于保存服务器的中间 CA 证书和根 CA 证书。可以附加其他受信任的 CA,用来进行客户端证书验证。
  12. ## Path to the file containing PEM-encoded CA certificates. The CA certificates
  13. ## Value: File
  14. listener.ssl.external.cacertfile = etc/certs/ca.pem
复制代码
MQTT 连接测试(OpenSSL)



  • 利用 OpenSSL 作为 Server 与 Client
    1. openssl s_server -accept 2009 -key emqx.key -cert emqx.pem
    复制代码
    1. $ openssl s_client -connect localhost:2009 -CAfile ca.pem -showcerts
    2. Verify return code: 0 (ok)
    复制代码
  • 利用 OpenSSL 作为 Client,EMQX 作为 Server
    启动 EMQX 并将日记等级改为 Debug。
    1. ./bin/emqx start
    2. ./bin/emqx_ctl log set-level debug
    复制代码
    利用 openssl s_client 连接 EMQX 并发送一个 Client ID 为 "a" 的 MQTT Connect 报文。
    1. $ echo -en "\x10\x0d\x00\x04MQTT\x04\x00\x00\x00\x00\x01a" | openssl s_client -connect localhost:8883 -CAfile ca.pem -showcerts
    2. Verify return code: 0 (ok)
    复制代码
    假如你在 emqx/log/erlang.log.1 中看到以下日记,分析 SSL 认证乐成。
    1. 2020-11-26 17:39:13.933 [debug] 127.0.0.1:51348 [MQTT] RECV CONNECT(Q0, R0, D0, ClientId=a, ProtoName=MQTT, ProtoVsn=4, CleanStart=false, KeepAlive=0, Username=undefined, Password=undefined)
    复制代码
MQTT 连接测试(MQTTX)

当配置完成并重启 EMQX 后,我们利用 MQTT 客户端工具 - MQTTX(该工具跨平台且支持 MQTT 5.0),来验证 TLS 服务是否正常运行。
   MQTTX 版本要求:v1.3.2 及以上版本
  

  • 参照下图在 MQTTX 中创建 MQTT 客户端(Host 输入框里的 127.0.0.1 需替换为实际的 EMQX 服务器 IP)


此时 Certificate 一栏需要选择 Self signed ,并携带自署名证书中生成的 ca.pem 文件。


  • 点击 Connect 按钮,连接乐成后,假如能正常执行 MQTT 发布/订阅 利用,则自署名证书的 SSL 单向认证配置乐成。


EMQX Dashboard 验证

最后,打开 EMQX 的 Dashboard 在 Listeners 页面可以看到在 8883 端口上有一个 mqtt:ssl 连接。


至此,我们乐成的完成了 EMQX 服务器的 SSL/TLS 配置及单向认证连接测试。EMQX SSL/TLS 双向认证配置文档请关注我们的后续文章。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

道家人

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表