在 EMQX 中开启 TLS
目标
使用 extraVolumes 和 extraVolumeMounts 字段自定义 TLS 证书。
基于 TLS 证书创建 Secret
Secret 是一种包含少量敏感信息的对象,例如密码、令牌或密钥。在本演示中,我们使用 Secret 存储 TLS 证书信息,因此在创建 EMQX 集群之前需要创建一个 Secret。
有关更多信息,请参阅 Secret 文档。
将以下内容保存为 YAML 文件,并使用 kubectl apply 命令部署:
yaml
apiVersion: v1
kind: Secret
metadata:
name: emqx-tls
type: kubernetes.io/tls
stringData:
ca.crt: |
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
tls.crt: |
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
tls.key: |
-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----TIP
在此示例中,上述三个字段的内容被省略。请用您自己的证书内容填充。
ca.crt应包含 CA 证书。tls.crt应包含服务器证书。tls.key应包含服务器的私钥。
配置 EMQX 集群
EMQX CRD apps.emqx.io/v2beta1 提供以下字段来为 EMQX 集群配置额外的卷和挂载点:
.spec.coreTemplate.extraVolumes.spec.coreTemplate.extraVolumeMounts.spec.replicantTemplate.extraVolumes.spec.replicantTemplate.extraVolumeMounts
在本演示中,我们将使用这些字段为 EMQX 集群提供 TLS 证书。
Volumes 的类型有很多种。有关 Volumes 的信息,请参阅 Volumes 文档。这里我们使用的是 secret 卷类型。
- 将以下内容保存为 YAML 文件,并使用
kubectl apply部署:
yaml
apiVersion: apps.emqx.io/v2beta1
kind: EMQX
metadata:
name: emqx
spec:
image: emqx/emqx:6.1.0
config:
# 配置从 `emqx-tls` 卷挂载的 TLS 监听器证书:
data: |
listeners.ssl.default {
bind = "0.0.0.0:8883"
ssl_options {
cacertfile = "/mounted/cert/ca.crt"
certfile = "/mounted/cert/tls.crt"
keyfile = "/mounted/cert/tls.key"
gc_after_handshake = true
handshake_timeout = 5s
}
}
license {
key = "..."
}
coreTemplate:
spec:
extraVolumes:
- name: emqx-tls
secret:
secretName: emqx-tls
extraVolumeMounts:
- name: emqx-tls
mountPath: /mounted/cert
replicantTemplate:
spec:
extraVolumes:
# 创建一个名为 `emqx-tls` 的 `secret` 卷类型:
- name: emqx-tls
secret:
secretName: emqx-tls
extraVolumeMounts:
- name: emqx-tls
# TLS 证书挂载到 EMQX 节点的目录:
mountPath: /mounted/cert
dashboardServiceTemplate:
spec:
type: LoadBalancer
listenersServiceTemplate:
spec:
type: LoadBalancer- 等待 EMQX 集群就绪。
使用 kubectl get 检查 EMQX 集群的状态,并确保 STATUS 为 Ready。这可能需要一些时间。
bash
$ kubectl get emqx
NAME STATUS AGE
emqx Ready 10m使用 MQTTX 验证 TLS 连接
MQTTX CLI 是一款开源的 MQTT 5.0 命令行客户端工具,旨在帮助开发者快速开始使用 MQTT 服务和应用。
获取 EMQX 监听器服务的外部 IP。
bashexternal_ip=$(kubectl get svc emqx-listeners -o json | jq '.status.loadBalancer.ingress[0].ip')使用 MQTTX CLI 订阅消息。连接到 TLS 监听器端口 8883,使用
--insecure标志跳过证书验证。bashmqttx sub -h ${external_ip} -p 8883 -t "hello" -l mqtts --insecure [10:00:25] › … Connecting... [10:00:25] › ✔ Connected [10:00:25] › … Subscribing to hello... [10:00:25] › ✔ Subscribed to hello在单独的终端窗口中发布消息。
bashmqttx pub -h ${external_ip} -p 8883 -t "hello" -m "hello world" -l mqtts --insecure [10:00:58] › … Connecting... [10:00:58] › ✔ Connected [10:00:58] › … Message Publishing... [10:00:58] › ✔ Message published观察订阅客户端接收消息。
bash[10:00:58] › payload: hello world这表明发布者和订阅者客户端都通过 TLS 连接成功与代理通信。