Angular ngx-mqtt使用WSS连接Mosquitto Broker失败求助
针对你遇到的问题,结合SSL_ERROR_RX_RECORD_TOO_LONG错误的常见原因,给出以下排查和解决步骤:
1. 补全Mosquitto 9001监听器的TLS配置细节
你的8883监听器明确指定了tls_version tlsv1.2,但9001的websockets监听器缺少这一行。虽然Mosquitto默认支持TLS 1.2及以上,但显式指定可避免协议协商不兼容问题。修改mosquitto.conf的9001监听器配置:
listener 9001 protocol websockets cafile /etc/mosquitto/certs/mqtt_ca.crt certfile /etc/mosquitto/certs/mqtt_srv.crt keyfile /etc/mosquitto/certs/mqtt_srv.key tls_version tlsv1.2
修改后重启Mosquitto服务,并查看/var/log/mosquitto/mosquitto.log,确认无证书加载失败、权限不足等启动报错。
2. 用OpenSSL验证Broker的WSS端口TLS握手
直接通过命令行测试9001端口的TLS是否正常工作,排除浏览器端干扰:
openssl s_client -connect <BROKER_IP>:9001 -servername <BROKER_IP>
若输出显示Verify return code: 0 (ok),说明Broker的TLS配置无问题;若握手失败,根据错误信息(如证书不匹配、密钥无效)调整证书配置。
3. 检查服务器证书的SAN字段是否合规
现代浏览器要求自签名证书必须包含Subject Alternative Name(SAN),且SAN中需包含Broker的IP或域名。用以下命令查看证书信息:
openssl x509 -in /etc/mosquitto/certs/mqtt_srv.crt -text -noout
找到X509v3 Subject Alternative Name字段,确认其中包含Angular配置中填写的<BROKER IP>或对应域名。若无SAN字段,需重新生成服务器证书,签发时添加SAN配置(如在openssl.cnf中添加subjectAltName = IP:<BROKER_IP>)。
4. 确认Angular端MQTT库的WSS配置兼容性
若使用ngx-mqtt这类库,确保WSS配置传递正确的TLS参数。部分库需显式指定tls选项,即使已导入CA证书:
export const MQTT_SERVICE_OPTIONS: IMqttServiceOptions = { hostname: '<BROKER IP>', port: 9001, protocol: 'wss', username: '<BROKER USERNAME>', password: '<BROKER PASSWORD>', tls: { rejectUnauthorized: true // 已导入信任CA时设为true;未导入可临时设为false测试,生产环境不建议 } };
同时检查库的版本是否兼容Angular 12和WSS协议,避免版本不兼容问题。
5. 排查中间设备的干扰
若Broker部署在有反向代理(如Nginx)或特殊路由器的环境中,确认:
- 反向代理是否正确配置WSS转发(需同时处理HTTP和WebSocket的TLS流量)
- 路由器的深度包检测(DPI)功能是否禁用,部分DPI会拦截或篡改WSS的TLS握手包
关于你提到的CA密钥用-aes256和4096位的问题:这不会导致SSL_ERROR_RX_RECORD_TOO_LONG错误,只要证书链正确,加密算法和密钥长度是兼容的,无需调整。
内容的提问来源于stack exchange,提问作者MotorBlade

