ddns-go访问提示ssl_error_rx_record_too_long怎么办?
出现 ssl_error_rx_record_too_long 时,通常不是证书过期、证书链错误或私钥问题,而是 HTTPS 与 HTTP 协议混用导致的握手失败。
浏览器期待收到 TLS 握手数据,但服务器端口返回了 HTTP 明文内容,因此产生协议解析错误。
先判断这是 SSL 证书错误还是 HTTPS 协议错误?
遇到该报错时,首先需要区分问题类型:
ssl_error_rx_record_too_long不等于 证书过期,也 不等于证书不受信任。- 它只表示一种情况——你正在用 HTTPS 协议去访问一个只提供了 HTTP 服务的端口。
当浏览器发起 HTTPS 请求(发送 Client Hello 握手数据包)时,如果接收端端口没有配置 TLS,而是直接用标准的 HTTP 报文回复,浏览器无法解析这种明文数据结构,就会报出“记录长度异常”的错误。
关于 TLS 握手与证书协议的基础原理,可以参考 HTTPS证书原理。
为什么会触发 ssl_error_rx_record_too_long 错误?
在 ddns-go 的使用场景中,引发该报错的常见原因包括:
- *在浏览器地址栏手动输入了
https://IP:9876,但 ddns-go 本身仅开启了默认的 HTTP 监听(未配置 SSL)。 - *使用 Nginx、Nginx Proxy Manager(NPM)给 ddns-go 做 HTTPS 代理时,后端
proxy_pass误写成了https://协议。 - *浏览器启用了 HTTPS-Only 模式、安装了强制 HTTPS 插件,或者域名存在 HSTS 历史策略,导致原本的 HTTP 请求被强制升级为 HTTPS。
- *在配置文件中启用了 HTTPS,但证书路径填写错误或私钥不匹配,导致 HTTPS 服务无法正常启动,实际端口仍然维持在 HTTP 模式。
排查流程与解决方法
针对 ddns-go 的常见部署形态,可以按照以下步骤逐步排查并解决:
- 第一步:检查访问协议与地址栏 如果是内网直接访问,且未在 ddns-go 中配置证书,请确保访问地址为
http://IP:9876(注意是 http 而非 https)。 - 第二步:检查 Nginx 反向代理配置(重点) 如果是通过 Nginx 为 ddns-go 配置域名和 HTTPS 访问,需特别注意
proxy_pass协议类型,并建议补充 WebSocket 支持以保证管理界面实时通信正常:
server {
listen 443 ssl;
server_name ddns.example.com;
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
location / {
# 正确写法:上游如果提供的是 HTTP 服务,必须写 http://
# 常见误区:写成 https://127.0.0.1:9876 就会报 ssl_error_rx_record_too_long
proxy_pass http://127.0.0.1:9876;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# 建议配置 WebSocket 转发支持
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
- 第三步:重置或修正 ddns-go 的 SSL 配置文件 如果是直接在 ddns-go 界面中开启 HTTPS:
- 检查
.crt/.pem证书文件与.key私钥文件路径是否正确,并确保运行用户有读取权限。 - 如果因配置错误导致无法登录 Web 页面,可修改 ddns-go 的配置文件(通常为
.ddns-go.yaml),将https字段相关配置清空或置为关闭,重启服务后通过http://重新进入管理页面。
如果需要重新配置服务端的证书链,可参考 服务器安装证书;若排查过程中遇到其他访问异常,可查阅 SSL错误解决方法。
FAQ 常见问题解答
Q:为什么只有 Firefox 浏览器提示 ssl_error_rx_record_too_long?
A:ssl_error_rx_record_too_long 是 Firefox(火狐)特有的报错代码。如果在 Chrome(谷歌浏览器)中遇到相同的协议混淆问题,通常会显示 ERR_SSL_PROTOCOL_ERROR,两者核心原因完全一致。
Q:Nginx 反向代理 ddns-go 为什么还会报这个错误?
A:最常见的原因是 Nginx 配置文件中的 proxy_pass 协议写错。例如前端监听了 443 端口(HTTPS),但将请求转发给 ddns-go 的 9876 端口时误写成了 proxy_pass https://127.0.0.1:9876;。由于 ddns-go 本身只开启了 HTTP 服务,Nginx 在与后端握手时就会触发此错误。
Q:ddns-go 一定需要配置 SSL 证书吗?
A:不一定。如果是纯局域网内网访问,直接使用 HTTP 即可;如果是通过公网域名访问,建议通过前置 Nginx / NPM 配置 HTTPS 进行反向代理,而不需要在 ddns-go 内部单独配置证书。关于具体的证书类型选择,可参考 SSL证书分类。



京公网安备11010502031690号
网站经营企业工商营业执照
















