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

如何配置AWS NLB解决Mosquitto的error:0A000126 SSL错误

解决NLB+Mosquitto部署中SSL意外EOF错误的配置方案

我在EC2实例上部署了MQTT Mosquitto代理,通过AWS ACM与NLB(网络负载均衡器)管理SSL加密及流量转发。MQTT客户端功能运行正常,但Mosquitto日志中反复抛出以下错误:

Client connection from [nlb-ip-address] failed: error:0A000126:SSL routines::unexpected eof while reading.

当前配置

Mosquitto配置(mosquitto.conf)

listener 8883
per_listener_settings false
cafile /etc/mosquitto/certs/ca.crt
certfile /etc/mosquitto/certs/server.crt
keyfile /etc/mosquitto/certs/server.key

NLB端口映射

443 -> 8883

解决方案

一、NLB侧配置调整

  • 启用TCP重置:NLB默认在连接超时或终止时可能不发送FIN包,导致Mosquitto侧触发意外EOF错误。进入NLB的目标组配置,开启「连接终止时发送TCP重置」选项,确保连接关闭时双方能正常完成SSL握手收尾。
  • 匹配空闲超时时间:将NLB的空闲超时时间设置为比Mosquitto的keepalive值大10秒以上(Mosquitto默认keepalive为60秒,NLB建议设为70秒),避免NLB主动断开未活动的连接引发SSL异常。
  • 确认SSL终止逻辑:由于使用ACM证书,需确保NLB监听协议为TLS(而非TCP),端口443且证书关联正确。NLB完成SSL终止后,转发到EC2的流量应为纯TCP——如果NLB已经做了SSL终止,Mosquitto侧不需要再处理SSL,否则会因双重SSL握手触发异常。

二、Mosquitto配置优化

  • 调整监听模式适配NLB:
    如果NLB已完成SSL终止,Mosquitto的8883端口应监听纯TCP流量,修改mosquitto.conf:
    listener 8883
    per_listener_settings true
    # 移除cafile、certfile、keyfile配置,SSL由NLB处理
    
    若坚持让Mosquitto处理SSL(NLB做TCP透传),则需:
    • 开启per_listener_settings true,确保端口配置独立生效
    • 添加require_certificate false(无需客户端证书认证时),避免因客户端未提供证书导致连接中断
    • 验证证书链:确保ca.crt包含完整的ACM证书链,防止SSL握手时证书验证失败

三、额外排查步骤

  • 检查EC2安全组:确认允许NLB的IP段访问8883端口,避免防火墙拦截导致连接异常断开
  • 抓包分析:在EC2上执行tcpdump port 8883,抓取NLB到Mosquitto的流量,确认SSL握手过程是否完整,是否存在异常断连情况

内容的提问来源于stack exchange,提问作者Dhaneja

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 20:25:00