Docker安装EMQX5.8并支持ssl证书连接和启用双向认证

要让Docker部署的EMQ X 5.8支持SSL证书连接并启用双向认证,需完成证书准备配置EMQ XDocker启动三个核心步骤。以下是详细操作指南:

一、准备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:通过配置文件挂载(更灵活)

  1. 本地创建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版本
      }
    }
  2. 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  # 调试模式

四、注意事项

  1. 证书路径:容器内证书路径需与配置一致,且权限需为emqx用户可读(Docker容器内默认权限通常满足)。
  2. TLS版本:建议仅启用tlsv1.2/tlsv1.3,禁用低版本(如tlsv1.1)以提高安全性。
  3. 生产环境:避免自签证书,使用Let’s Encrypt或商业CA颁发的证书;客户端证书需由同一CA签名。
  4. 性能优化:若客户端数量大,可启用证书缓存(EMQ X默认已优化)。

通过以上步骤,即可实现Docker部署的EMQ X 5.8支持SSL双向认证。


Docker安装EMQX5.8并支持ssl证书连接和启用双向认证
https://www.gmtgo.com/27757.html
作者
大帅
发布于
2025年11月30日
许可协议