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