# 开启 SSL/TLS 连接

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

本章节将向您详细介绍 SSL/TLS 加密连接以及如何在 EMQX 中开启 SSL/TLS 连接。

# 安全优势

  1. 强认证:开启 TLS 连接后,通讯双方将互相检查对方的身份,比如通过检查对方持有的 X.509 数字证书;这类数字证书通常是由受信机构 CA(Certificate Authority)颁发,不可伪造。

  2. 机密性:开启 TLS 连接后,每次会话都会根据双方协商得到的会话密钥进行加密。任何第三方都无法知晓通讯内容,因此即使一次会话的密钥泄露,也不影响其他会话的安全性。

  3. 完整性:加密通讯中的数据被篡改的可能性极低。

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

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

本章节将重点介绍如何直接在客户端与 EMQX 之间开启 SSL/TLS 连接,有关如何通过代理或负载均衡终结 TLS 连接,请参考 集群负载均衡

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

前置准备:

已具备 SSL/TLS 证书。

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

  1. 将 SSL/TLS 证书文件移动到 EMQX etc/cert 目录。
  2. 打开配置文件 emqx.conf (根据您的安装方式,可能位于 ./etc/etc/emqx/etc 目录),修改 listeners.ssl.default 配置组,将证书替换为您的证书,并添加 verify = verify_none
listeners.ssl.default {
  bind = "0.0.0.0:8883"
  max_connections = 512000
  ssl_options {
    # keyfile = "etc/certs/key.pem"
    keyfile = "etc/certs/server.key"
    # certfile = "etc/certs/cert.pem"
    certfile = "etc/certs/server.crt"
    # cacertfile = "etc/certs/cacert.pem"
    cacertfile = "etc/certs/rootCA.crt"

    # 不开启对端验证
    verify = verify_none
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

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

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

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

# Ciphers

# TLS ciphers

从 v5.0.6 开始, EMQX 不在配置文件中详细列出所有默认的密码套件名称,而是会在配置文件中使用一个空列表,然后在运行时替换成默认的密码套件。

EMQX 默认支持以下密码套件:

tlsv1.3:

ciphers =
  [ "TLS_AES_256_GCM_SHA384", "TLS_AES_128_GCM_SHA256",
    "TLS_CHACHA20_POLY1305_SHA256", "TLS_AES_128_CCM_SHA256",
    "TLS_AES_128_CCM_8_SHA256"
  ]
1
2
3
4
5

tlsv1.2 或更早:

ciphers =
  [ "ECDHE-ECDSA-AES256-GCM-SHA384",
    "ECDHE-RSA-AES256-GCM-SHA384",
    "ECDHE-ECDSA-AES256-SHA384",
    "ECDHE-RSA-AES256-SHA384",
    "ECDH-ECDSA-AES256-GCM-SHA384",
    "ECDH-RSA-AES256-GCM-SHA384",
    "ECDH-ECDSA-AES256-SHA384",
    "ECDH-RSA-AES256-SHA384",
    "DHE-DSS-AES256-GCM-SHA384",
    "DHE-DSS-AES256-SHA256",
    "AES256-GCM-SHA384",
    "AES256-SHA256",
    "ECDHE-ECDSA-AES128-GCM-SHA256",
    "ECDHE-RSA-AES128-GCM-SHA256",
    "ECDHE-ECDSA-AES128-SHA256",
    "ECDHE-RSA-AES128-SHA256",
    "ECDH-ECDSA-AES128-GCM-SHA256",
    "ECDH-RSA-AES128-GCM-SHA256",
    "ECDH-ECDSA-AES128-SHA256",
    "ECDH-RSA-AES128-SHA256",
    "DHE-DSS-AES128-GCM-SHA256",
    "DHE-DSS-AES128-SHA256",
    "AES128-GCM-SHA256",
    "AES128-SHA256",
    "ECDHE-ECDSA-AES256-SHA",
    "ECDHE-RSA-AES256-SHA",
    "DHE-DSS-AES256-SHA",
    "ECDH-ECDSA-AES256-SHA",
    "ECDH-RSA-AES256-SHA",
    "ECDHE-ECDSA-AES128-SHA",
    "ECDHE-RSA-AES128-SHA",
    "DHE-DSS-AES128-SHA",
    "ECDH-ECDSA-AES128-SHA",
    "ECDH-RSA-AES128-SHA"
  ]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

配置 PSK 认证的监听器

ciphers = [
  [ "RSA-PSK-AES256-GCM-SHA384",
    "RSA-PSK-AES256-CBC-SHA384",
    "RSA-PSK-AES128-GCM-SHA256",
    "RSA-PSK-AES128-CBC-SHA256",
    "RSA-PSK-AES256-CBC-SHA",
    "RSA-PSK-AES128-CBC-SHA"
  ]
1
2
3
4
5
6
7
8

# 扩展阅读:如何获取 SSL/TLS 证书

您可通过以下两种方式获取相关 SSL/TLS 证书:

  1. 自签名证书:即使用自己签发的证书,由于自签名证书存在较多的安全隐患,因此只建议用于测试验证环境。
  2. 申请或购买证书:您可以向 Let's Encrypt (opens new window) 或华为云、腾讯云等云厂商申请免费证书,也可以向 DigiCert (opens new window) 等机构购买收费证书。对于企业级用户,一般建议申请收费的 OV 及以上类型的证书,以获取更高等级的安全保护。

# 创建自签名证书

前置准备

已安装 OpenSSL (opens new window)

  1. 运行以下命令生成密钥对,该命令随即会提示您输入密钥保护密码,后续在生成、签发、验证证书时均需要此密码。请妥善相关密钥及密码。
openssl genrsa -des3 -out rootCA.key 2048
1
  1. 运行以下命令通过密钥对中的私有密钥生成 CA 证书,该命令随即会提示您设置证书的唯一标识名称 DN(Distinguished Name)。
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 3650 -out rootCA.crt
1
  1. 使用步骤 2 中的 CA 证书来签发服务端证书,用于验证服务器所有者的身份,服务端证书通常颁发给主机名、服务器名称或域名(如 www.emqx.com)。我们需要 CA 密钥(rootCA.key)、CA 证书( rootCA.crt)和服务端 CSR (server.csr)生成服务端证书。

3.1 运行以下命令生成服务端证书密钥对:

openssl genrsa -out server.key 2048
1

3.2 运行以下命令使用 Server 密钥对制作 CSR。经 CA 根证书私钥签名后,CSR 可生成颁发给用户的证书公钥文件。该命令随即也会要求设置证书的唯一标识名称。

openssl req -new -key server.key -out server.csr
1

系统将提示以下信息,对应的含义如下:

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]: # 国家/地区
State or Province Name (full name) [Some-State]: # 省/市
Locality Name (eg, city) []: # 城市
Organization Name (eg, company) [Internet Widgits Pty Ltd]: # 组织机构(或公司名),如 EMQ
Organizational Unit Name (eg, section) []: # 机构部门,如 EMQX
Common Name (e.g. server FQDN or YOUR name) []: # 通用名称,此处应当设置为服务器域名如 mqtt.emqx.com
...
1
2
3
4
5
6
7
8
9
10
11
12
13
14

3.3 生成服务端证书,此时也可指定证书的有效天数,此处为 365 天:

openssl x509 -req -in server.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out server.crt -days 365
1

至此您就得到了一组证书。

.
├── rootCA.crt
├── rootCA.key
├── rootCA.srl
├── server.crt
├── server.csr
└── server.key
1
2
3
4
5
6
7