0

背景

  • 我设置并配置了 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 订阅

当我尝试使用 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 反复得到。我究竟做错了什么?

4

2 回答 2

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
于 2020-06-16T08:22:42.817 回答
0

mosquitto_sub 手册页:

加密连接

mosquitto_sub 支持 TLS 加密连接。强烈建议您将加密连接用于除最基本设置之外的任何操作。

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


--capath

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

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

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

于 2019-12-31T15:25:54.950 回答