Docker安装EMQX5.8并支持ssl证书连接和启用双向认证
要让Docker部署的EMQ X 5.8支持SSL证书连接并启用双向认证,需完成证书准备、配置EMQ X、Docker启动三个核心步骤。以下是详细操作指南:
一、准备SSL证书(双向认证需要服务端+客户端证书)
双向认证需要CA证书、服务端证书/私钥、客户端证书/私钥。可通过OpenSSL自签(测试用)或购买权威CA证书(生产用)。
1. 自签证书示例(OpenSSL)
# 创建证书目录
mkdir -p emqx_ssl/{ca,server,client} && cd emqx_ssl
# 1. 生成CA私钥和证书(根证书)
openssl genrsa -out ca/ca.key 2048
openssl req -x509 -new -nodes -key ca/ca.key -days 3650 -out ca/ca.crt -subj "/CN=EMQx CA"
# 2. 生成服务端私钥和CSR
openssl genrsa -out server/server.key 2048
openssl req -new -key server/server.key -out server/server.csr -subj "/CN=emqx-server"
# 3. 用CA签名服务端证书
openssl x509 -req -in server/server.csr -CA ca/ca.crt -CAkey ca/ca.key -CAcreateserial -out server/server.crt -days 3650
# 4. 生成客户端私钥和CSR
openssl genrsa -out client/client.key 2048
openssl req -new -key client/client.key -out client/client.csr -subj "/CN=emqx-client"
# 5. 用CA签名客户端证书
openssl x509 -req -in client/client.csr -CA ca/ca.crt -CAkey ca/ca.key -CAcreateserial -out client/client.crt -days 3650最终证书目录结构:
emqx_ssl/
├── ca/
│ ├── ca.crt (CA根证书)
│ └── ca.key
├── server/
│ ├── server.crt (服务端证书)
│ ├── server.csr
│ └── server.key (服务端私钥)
└── client/
├── client.crt (客户端证书)
├── client.csr
└── client.key (客户端私钥)二、配置EMQ X启用SSL双向认证
EMQ X 5.8通过配置文件或环境变量启用SSL监听器(如MQTTs 8883端口)并开启双向认证。
方式1:通过环境变量配置(Docker启动时直接指定)
docker run -d \
--name emqx58 \
-p 1883:1883 \ # MQTT TCP
-p 8883:8883 \ # MQTT SSL/TLS
-p 8083:8083 \ # MQTT WebSocket
-p 8084:8084 \ # MQTT WebSocket SSL/TLS
-p 18083:18083 \ # Dashboard
-v $(pwd)/emqx_ssl:/opt/emqx/etc/certs \ # 挂载证书目录到EMQ X容器
-e "EMQX_LISTENERS__SSL__DEFAULT__BIND=0.0.0.0:8883" \
-e "EMQX_LISTENERS__SSL__DEFAULT__SSL_OPTIONS__cacertfile=/opt/emqx/etc/certs/ca/ca.crt" \
-e "EMQX_LISTENERS__SSL__DEFAULT__SSL_OPTIONS__certfile=/opt/emqx/etc/certs/server/server.crt" \
-e "EMQX_LISTENERS__SSL__DEFAULT__SSL_OPTIONS__keyfile=/opt/emqx/etc/certs/server/server.key" \
-e "EMQX_LISTENERS__SSL__DEFAULT__SSL_OPTIONS__verify=verify_peer" \ # 开启双向认证
-e "EMQX_LISTENERS__SSL__DEFAULT__SSL_OPTIONS__fail_if_no_peer_cert=true" \ # 强制客户端提供证书
emqx/emqx:5.8方式2:通过配置文件挂载(更灵活)
本地创建EMQ X配置文件
emqx.conf:# 启用SSL监听器 listeners.ssl.default { bind = "0.0.0.0:8883" ssl_options { cacertfile = "/opt/emqx/etc/certs/ca/ca.crt" # CA证书(验证客户端) certfile = "/opt/emqx/etc/certs/server/server.crt" # 服务端证书 keyfile = "/opt/emqx/etc/certs/server/server.key" # 服务端私钥 verify = verify_peer # 双向认证:验证客户端证书 fail_if_no_peer_cert = true # 强制客户端提供证书 versions = ["tlsv1.2", "tlsv1.3"] # 支持的TLS版本 } }Docker启动时挂载配置文件和证书:
docker run -d \ --name emqx58 \ -p 1883:1883 -p 8883:8883 -p 18083:18083 \ -v $(pwd)/emqx.conf:/opt/emqx/etc/emqx.conf \ # 挂载配置文件 -v $(pwd)/emqx_ssl:/opt/emqx/etc/certs \ # 挂载证书目录 emqx/emqx:5.8
三、验证双向认证是否生效
1. 查看EMQ X日志(确认SSL监听器启动)
docker logs emqx58 | grep ssl输出类似:listeners.ssl.default opened on 0.0.0.0:8883 表示成功。
2. 使用MQTT客户端测试(需携带客户端证书)
以mosquitto_pub为例(需安装mosquitto客户端):
mosquitto_pub \
-h localhost -p 8883 \
-t "test/ssl" -m "hello双向认证" \
--cafile emqx_ssl/ca/ca.crt \ # 服务端CA证书(验证服务端)
--cert emqx_ssl/client/client.crt \ # 客户端证书
--key emqx_ssl/client/client.key \ # 客户端私钥
--tls-version tlsv1.3 \
-d # 调试模式- 成功:消息发送成功,EMQ X Dashboard(http://localhost:18083,默认账号`admin`/`public`)可看到客户端连接。
- 失败:若未携带客户端证书,会报错
Connection Refused或ssl_handshake_error,说明双向认证生效。
四、注意事项
- 证书路径:容器内证书路径需与配置一致,且权限需为
emqx用户可读(Docker容器内默认权限通常满足)。 - TLS版本:建议仅启用
tlsv1.2/tlsv1.3,禁用低版本(如tlsv1.1)以提高安全性。 - 生产环境:避免自签证书,使用Let’s Encrypt或商业CA颁发的证书;客户端证书需由同一CA签名。
- 性能优化:若客户端数量大,可启用证书缓存(EMQ X默认已优化)。
通过以上步骤,即可实现Docker部署的EMQ X 5.8支持SSL双向认证。
Docker安装EMQX5.8并支持ssl证书连接和启用双向认证
https://www.gmtgo.com/27757.html