You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular ngx-mqtt使用WSS连接Mosquitto Broker失败求助

解决Angular WSS连接Mosquitto报SSL_ERROR_RX_RECORD_TOO_LONG的思路

针对你遇到的问题,结合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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 07:41:35