ngx-mqtt 通过 webapp 连接到 SSL/TLS mosquitto broker

ngx-mqtt connect via webapp to SSL/TLS mosquitto broker

我正在使用覆盆子 运行 代理和 java 后端。 Broker 有它的证书,后端已经通过 ssl 连接,没有任何问题。问题是,正如 mcollina 已经提到的,如果我想通过 webapp 连接到 mosquitto 代理,我不能使用密钥、证书或 ca。

这些是我的客户选项:

    const MQTT_SERVICE_OPTIONS: IMqttServiceOptions = {
          hostname: environment.hostname,
          port: 8883,
          protocol: 'wss',
          clientId: this.hashId,
          username: environment.mqttUsername,
          password: environment.mqttPassword,
        }
    
    this.mqttService = new MqttService(MQTT_SERVICE_OPTIONS);

这是蚊子日志:

1611954829: New connection from xx.x.xxx.xxx on port 8883.
1611954829: Socket error on client <unknown>, disconnecting.

到目前为止我找不到可行的解决方案。

编辑:

蚊子配置:

tls_version tlsv1.2
cafile /etc/ssl/certs/my_domain_115928960DigiCertCA.crt
certfile /etc/ssl/certs/my_domain_115928960my-domain.crt
keyfile /home/pi/Desktop/server/cert/www.my-domain.key

allow_anonymous false
password_file /etc/mosquitto/passwd

port 8883
listener 8884
protocol websockets

我来猜一猜。您正在与您的经纪人一起使用自签名证书。

这将导致任何 Web 浏览器出现问题,因为与使用自签名证书与 HTTP 服务器建立 HTTPS 连接时不同,浏览器不会弹出有关用户可以选择的不受信任证书的警告接受。

建立安全 Websocket 连接时,代理提供的证书必须已被浏览器信任。

您有 2 个选择:

  1. 将您正在使用的 CA 证书添加到代理证书存储区。执行此操作的方式因经纪人而异(并且可能还取决于 OS 浏览器 运行 上的内容)。问题是您必须对每个想要访问该站点的浏览器执行此操作。这只是开发环境或企业设置中的一个选项,在这些环境中,中央管理系统可以推送 CA 证书。

  2. 使用来自现有可信 CA 的证书。例如Letsencrypt.org 这些都是免费的,并且已被所有浏览器信任。

mosquitto 中的证书配置依赖于侦听器,因此您需要列出两次证书才能使其正常工作。一次用于绑定到 port 命令的默认侦听器,一次用于 websocket 侦听器。

把你mosquitto.conf改成这样:

allow_anonymous false
password_file /etc/mosquitto/passwd

port 8883
tls_version tlsv1.2
cafile /etc/ssl/certs/my_domain_115928960DigiCertCA.crt
certfile /etc/ssl/certs/my_domain_115928960my-domain.crt
keyfile /home/pi/Desktop/server/cert/www.my-domain.key

listener 8884
protocol websockets
cafile /etc/ssl/certs/my_domain_115928960DigiCertCA.crt
certfile /etc/ssl/certs/my_domain_115928960my-domain.crt
keyfile /home/pi/Desktop/server/cert/www.my-domain.key