开启 SSL/TLS 连接

SSL/TLS 加密功能会在传输层对网络连接进行加密,它能在提升通信数据安全性的同时,保证数据的完整性。EMQX 提供了非常完整的 SSL/TLS 能力支持,包括支持单/双向认证、X.509 证书认证,您可以为包括 MQTT 在内的所有连接启用 SSL/TLS 加密连接,保证接入与消息传输安全。单向认证只保证通信被加密但无法验证客户端身份。而双向认证可以同时验证客户端身份,如果客户端无法提供证书,SSL/TLS 连接将被拒绝。

对于客户端的 SSL/TLS 连接,您可以根据使用场景选择以下两种使用方式之一:

使用方式优势缺点
直接在客户端与 EMQX 之间开启 SSL/TLS 连接简单易用,不需要额外的组件。会增加 EMQX 的资源消耗,如果连接数量巨大,可能会导致较高的 CPU 和内存消耗。
通过代理或负载均衡终结 TLS 连接不影响 EMQX 性能,同时提供了负载均衡能力。只有少数云厂商的负载均衡器支持 TCP SSL/TLS 终结,此外,用户还需自己部署 HAProxy开启 SSL/TLS 连接 - 图1 (opens new window) 等软件。

本章节将向您详细介绍 SSL/TLS 加密连接以及如何在 EMQX 中通过 Dashboard 和 配置文件开启 SSL/TLS 连接。有关如何通过代理或负载均衡终结 TLS 连接,请参考集群负载均衡

安全优势

启用 SSL/TLS 连接提供了以下安全优势:

  1. 强认证:开启 TLS 连接后,通讯双方将互相检查对方的身份,比如通过检查对方持有的 X.509 数字证书;这类数字证书通常是由受信机构 CA(Certificate Authority)颁发,不可伪造。
  2. 机密性:开启 TLS 连接后,每次会话都会根据双方协商得到的会话密钥进行加密。任何第三方都无法知晓通讯内容,因此即使一次会话的密钥泄露,也不影响其他会话的安全性。
  3. 完整性:加密通讯中的数据被篡改的可能性极低。

前置准备

开始之前,您需要具备 SSL/TLS 证书。EMQX 随安装包提供了一组仅用于测试的 SSL/TLS 证书(位于 etc/certs 目录),并在 8883 端口启用了 SSL/TLS 连接。当应用于生产环境时,应切换至由可靠 CA 签发的证书。有关如何申请相关证书,请参考获取 SSL/TLS 证书部分。

通过 Dashboard 开启 SSL/TLS 连接

8883 端口上启用的 SSL 监听器用来加密客户端与 EMQX 之前的数据传输。在 EMQX Dashboard 中,您可以通过修改 SSL 监听器的设置来开启 SSL/TLS 连接。

  1. 将您的私人SSL/TLS 证书文件保存到 EMQX 的 etc/certs 目录下。

  2. 转到 EMQX Dashboard,在左侧导航栏中点击管理 -> 监听器

  3. 监听器页面, 在类型为 SSL 的监听器的名称列中点击 default

    • 验证服务器证书:默认为不启用。如果需要验证客户端身份进行双向认证,点击切换开关。
    • TLS Cert, TLS KeyCA Cert:点击重新设置上传您的私人证书文件以替换当前的证书文件。
    • SSL 版本: 支持所有 TLS/DTLS 版本。默认设置为 tlsv1.3tlsv1.2。如果 PSK 验证中使用了 PSK 密码套件,确保在此处设置 tlsv1.2tlsv1.1tlsv1。更多关于 PSK 验证的内容,参阅 启用 PSK 验证
    • 没有证书则 SSL 失败:在验证服务器证书启用时使用。默认设置为 false
      • 如果设置为 true,如果客户端发送空证书,则客户端身份验证失败,SSL/TLS 连接将被拒绝。
      • 如果设置为 false,只有当客户端发送无效证书时,客户端身份验证失败(空证书被认为是有效证书),SSL/TLS 连接将被拒绝。
    • CA 证书深度:允许的证书文件路径最大深度; 默认值为 10
    • 密钥文件密码:如果密钥文件由密码保护,则需要输入密码。
    • 启用 OCSP Stapling: 默认为不启用;如需获取 X509 数字证书的撤销状态,可以点击切换开关。具体可参阅 OCSP Stapling
    • 启用 CRL 检查:默认为不启用;如需设置证书吊销列表(CRL)检查功能,可以点击切换开关。具体可参阅 CRL 检查
  4. 完成编辑后,点击更新

    edit-listener

通过配置文件开启 SSL/TLS 连接

  1. 将 SSL/TLS 证书文件移动到 EMQX etc/cert 目录。

  2. 打开配置文件 emqx.conf (根据您的安装方式,可能位于 ./etc/etc/emqx/etc 目录),修改 listeners.ssl.default 配置组,将证书替换为您的证书,并添加 verify = verify_none

    1. listeners.ssl.default {
    2. bind = "0.0.0.0:8883"
    3. max_connections = 512000
    4. ssl_options {
    5. # keyfile = "etc/certs/key.pem"
    6. keyfile = "etc/certs/server.key"
    7. # certfile = "etc/certs/cert.pem"
    8. certfile = "etc/certs/server.crt"
    9. # cacertfile = "etc/certs/cacert.pem"
    10. cacertfile = "etc/certs/rootCA.crt"
    11. # 不开启对端验证
    12. verify = verify_none
    13. }
    14. }

    至此您已经完成 EMQX 上的 SSL/TLS 单向认证配置,单向认证仅保证通信已经被加密,无法 验证客户端身份。

    如需启用双向认证,请在 listeners.ssl.default 配置组中添加如下配置:

    1. listeners.ssl.default {
    2. ...
    3. ssl_options {
    4. ...
    5. # 开启对端验证
    6. verify = verify_peer
    7. # 强制开启双向认证,如果客户端无法提供证书,则 SSL/TLS 连接将被拒绝
    8. fail_if_no_peer_cert = true
    9. }
    10. }
  3. 重启 EMQX,应用以上配置。