【问题标题】:Test VerneMQ broker TLS with Mosquitto client使用 Mosquitto 客户端测试 VerneMQ 代理 TLS
【发布时间】:2019-12-31 10:21:07
【问题描述】:

背景

  • 我设置并配置了 VerneMQ 代理。 Broker 在 docker 容器中,我使用 docker-compose.yml 启动它。这是我的 docker-compose 文件的外观:
version: '3.3'
services:
  db:
    image: erlio/docker-vernemq
    container_name: vernemq1
    network_mode: docker_mysql_default
    restart: always
    environment:
      DOCKER_VERNEMQ_ALLOW_ANONYMOUS: 'off'
      DOCKER_VERNEMQ_PLUGINS.vmq_diversity: 'on'
      DOCKER_VERNEMQ_PLUGINS.vmq_passwd: 'off'
      DOCKER_VERNEMQ_PLUGINS.vmq_acl: 'off'
      DOCKER_VERNEMQ_VMQ_DIVERSITY.auth_mysql.enabled: 'on'
      DOCKER_VERNEMQ_VMQ_DIVERSITY.mysql.host: 'docker_mysql'
      DOCKER_VERNEMQ_VMQ_DIVERSITY.mysql.port: '3306'
      DOCKER_VERNEMQ_VMQ_DIVERSITY.mysql.user: 'vernemq'
      DOCKER_VERNEMQ_VMQ_DIVERSITY.mysql.password: 'vernemq'
      DOCKER_VERNEMQ_VMQ_DIVERSITY.mysql.database: 'vernemq_db'
      DOCKER_VERNEMQ_VMQ_DIVERSITY.mysql.password_hash_method: 'md5'
      DOCKER_VERNEMQ_LISTENER__SSL__CAFILE: '/vernemq/etc/ssl/chain.pem'
      DOCKER_VERNEMQ_LISTENER__SSL__CERTFILE: '/vernemq/etc/ssl/cert.pem'
      DOCKER_VERNEMQ_LISTENER__SSL__KEYFILE: '/vernemq/etc/ssl/privkey.pem'
      DOCKER_VERNEMQ_LISTENER__SSL__DEFAULT: '0.0.0.0:8081'
      DOCKER_VERNEMQ_LISTENER__SSL__DEFAULT__USE_IDENTITY_AS_USERNAME: 'off'
      DOCKER_VERNEMQ_LISTENER__SSL__DEFAULT__REQUIRE_CERTIFICATE: 'off'
    ports:
      # <Port exposed> : <Port running inside container>
      - '1883:1883'
      - '8081:8081'
    expose:
      # Opens port 1883 on the container
      - '1883'
      - '8081'
      # Where our data will be persisted
    volumes:
     - /var/lib/
     - /home/ubuntu/etc/ssl:/vernemq/etc/ssl
# Name our volume
volumes:
  my-db:

DOCKER_VERNEMQ_LISTENER__SSL__CAFILE: '/vernemq/etc/ssl/chain.pem'
DOCKER_VERNEMQ_LISTENER__SSL__CERTFILE: '/vernemq/etc/ssl/cert.pem'
DOCKER_VERNEMQ_LISTENER__SSL__KEYFILE: '/vernemq/etc/ssl/privkey.pem'
DOCKER_VERNEMQ_LISTENER__SSL__DEFAULT: '0.0.0.0:8081'
DOCKER_VERNEMQ_LISTENER__SSL__DEFAULT__USE_IDENTITY_AS_USERNAME: 'off'
DOCKER_VERNEMQ_LISTENER__SSL__DEFAULT__REQUIRE_CERTIFICATE: 'off'
  • 我使用 openssl 客户端测试/验证了 TLS 连接: openssl s_client -connect 172.18.0.4:8081 -key privkey.pem -cert cert.pem 我从服务器 localhost 执行此操作,172.18.0.4 是 vernemq docker 容器的 IP 地址,8081 是预期的 SSL 默认端口(侦听器),并提供了密钥/证书 这就是结果(我想这意味着 TLS 监听器工作):

问题

如何使用 mosquitto 客户端或任何其他 mqtt 客户端进行测试? 我想在发布和订阅时使用基于 TLS 的连接。

当我不使用 TLS 时,这是我执行 mosquitto_sub(订阅客户端)的方式: mosquitto_sub -h <ip_address> -p 1883 -t topic -d -u user -P password -i client-id

这是响应: VerneMQ Subscription

当我尝试使用 TLS 时,我添加了 --key 和 --cert 选项以使用私钥和证书: mosquitto_sub -h <ip_address> -p 1883 -t topic -d -u user -P password -i client-id --key privkey.pem --cert cert.pem

我只得到 Client user sending CONNECT 反复。我做错了什么?

【问题讨论】:

    标签: docker ssl docker-compose mosquitto mqtt-vernemq


    【解决方案1】:

    您需要做的一些事情为您的证书目录提供正确的权限,您需要确保为运行 verneMQ 的用户设置权限,在我的情况下,它的“vernemq”现在接下来的事情是设置权限到证书文件夹

    chown -R vernemq:vernemq /etc/letsencrypt/live
    

    所有配置文件应为 .pem 格式

    listener.ssl.cafile = /etc/letsencrypt/live/mqtts.domain.com/chain.pem
    listener.ssl.certfile = /etc/letsencrypt/live/mqtts.domain.com/cert.pem
    listener.ssl.keyfile = /etc/letsencrypt/live/mqtts.domain.com/privkey.pem
    

    如果您没有,客户端必须使用 Fullchain.pem 连接到服务器 域证书由中间“Let's Encrypt Authority X3”颁发,该中间证书由“DST Root CA X3”(来自 IdenTrust)交叉签名。 IdenTrust 受到大多数操作系统和应用程序的广泛信任,我们将“DST Root CA X3”作为根 CA。 如果您不是在太旧的操作系统上,那么您可以在本地机器上使用它

    cat /etc/ssl/certs/DST_Root_CA_X3.pem /etc/letsencrypt/live/$domain/chain.pem > ca.pem
    

    【讨论】:

      【解决方案2】:

      来自mosquitto_subman 页面:

      加密连接

      mosquitto_sub 支持 TLS 加密连接。它是强烈的 建议您使用加密连接进行更多操作 比最基本的设置。

      要在使用 x509 证书时启用 TLS 连接,请使用以下任一 --cafile 或 --capath 必须作为选项提供。


      --capath

      定义包含受信任的 PEM 编码 CA 证书的目录的路径。用于启用 SSL 通信。

      要使 --capath 正常工作,证书文件必须以“.crt”作为文件结尾,并且每次添加/删除证书时都必须运行“openssl rehash”。

      要使用mosquitto_sub 命令,您必须提供包含受信任 CA 证书的文件或包含受信任 CA 证书集合的目录

      【讨论】:

      • 我尝试将 --capath 选项包含到 ssl 文件夹的绝对路径中。 mosquitto_sub 客户端输出此响应:OpenSSL 错误:错误:14090086:SSL 例程:ssl3_get_server_certificate:证书验证失败错误:发生 TLS 错误。 VerneMQ 日志:[信息] TLS 服务器:在状态 certify 中收到 CLIENT ALERT:致命 - 未知 CA 我正在为 VerneMQ 配置使用相同的证书文件。我只尝试了 fullchain 和 rootCA 链。我不知道下一步该尝试什么。
      • 试试--cafile直接指向全链文件(需要pem格式)
      • 确认:fullchain 是 pem 格式。我试过了,蚊子的反应是:“错误:设置 TLS 选项时出现问题:找不到文件。”然而,没有 VerneMQ 输出。我需要添加--key--cert 吗?
      • 找不到文件意味着您的文件路径错误。不,如果您使用证书对客户端进行身份验证,则只需要 --key--cert
      • 这就是困扰我的地方。我 100% 确定这是文件路径。
      猜你喜欢
      • 2013-09-24
      • 1970-01-01
      • 2021-09-22
      • 1970-01-01
      • 2021-03-15
      • 2020-06-13
      • 1970-01-01
      • 1970-01-01
      • 2014-01-29
      相关资源
      最近更新 更多