SSL_ERROR_RX_RECORD_TOO_LONG 怎么解决

该错误常见于"HTTPS 请求打到了说 HTTP 的端口"——服务器 SSL 配置错位。检查 443 端口是否真的开了 SSL、VirtualHost 的 SSLEngine、以及是否有非 SSL 服务占用了 443。

最佳实践
加密网络与通信桥梁插画

一句话回答:这个错误常见于客户端用 TLS 握手,端口却返回明文 HTTP,导致 TLS 记录解析失败;仅凭错误名称不能排除其他异常响应。最常见的原因:Apache/Nginx 的 443 端口 VirtualHost 里没开 SSL(漏了 SSLEngine on 或 listen 443 ssl)、HTTP 服务监听了 443、或代理把明文流量转发到了 HTTPS 端口。逐层确认"443 上跑的到底是不是 TLS",再结合代理和握手结果定位。

排查步骤

1. 确认 443 端口在说什么

# 对目标域名发起 TLS 握手,并发送对应 SNI
openssl s_client -connect 域名:443 -servername 域名
# 明文 HTTP 提示协议错位;立即断开还可能是策略或协议等其他原因

用 curl 交叉验证:

curl -v http://域名:443/     # 检查是否正常提供明文业务;HTTPS 服务也可能对明文请求返回 HTTP 400

2. Apache:检查 VirtualHost

<VirtualHost *:443>
    ServerName example.com
    # 启用 TLS
    SSLEngine on
    SSLCertificateFile    /etc/ssl/cert.crt
    SSLCertificateKeyFile /etc/ssl/server.key
</VirtualHost>

确认 mod_ssl 已启用(Debian/Ubuntu 可用 a2enmod ssl),同时存在合适的 Listen 443。用 apachectl -M 和 apachectl -S 检查模块及虚拟主机,配置里 <VirtualHost *:443> 别错写成 *:80。

3. Nginx:检查 listen 指令

server {
    listen 443 ssl;        # 启用 TLS;缺失时可能出现协议错误
    server_name example.com;
    ssl_certificate     /etc/ssl/cert.crt;
    ssl_certificate_key /etc/ssl/server.key;
}

4. 代理/端口转发层

前面有 LB/端口转发时,确认"443 → 后端 80"的协议转换是 LB 终止 TLS(正常架构),而不是把 HTTPS 流量原样转给了后端的 HTTP 端口。

修复监听协议后,分别验证端口连接和 HTTPS 请求。观测云 TCP 拨测与 HTTP 拨测可分别检查这两个环节;TCP 正常而 HTTPS 失败时,继续检查证书、协议及反向代理配置,不能单凭该组合就判定服务返回了明文。

其他可能

  • 非标准 HTTPS 端口(如 8443)被当成 443 访问
  • 同一 IP 上两个站点共用 443 但只有一套 SSL 配置(SNI 时代应以 server_name 区分,参考多域名配置)
  • NAT/端口映射把 443 转到错误服务;普通安全组只过滤流量,不转发端口

常见问题(FAQ)

Q:只有 Firefox 报这个错,Chrome 报别的?

A:各家对同一问题的报错文案不同:Firefox 是 SSL_ERROR_RX_RECORD_TOO_LONG,Chrome 可能报 ERR_SSL_PROTOCOL_ERROR;这些名称不能证明根因相同,仍需核对实际响应和配置。

Q:改完配置还报同样的错?

A:nginx -t/apachectl configtest 通过后 reload;有 CDN/LB 的话检查边缘节点配置;继续核对 DNS、实际访问节点和 TLS 握手结果;清除浏览器缓存不能修复服务器协议错位。

Q:自签证书会导致这个错吗?

A:自签名本身通常导致证书信任错误,而非 RECORD_TOO_LONG;但同一部署可同时存在证书和协议配置问题,应分别验证。


参考资料

本文依据官方资料核对,未进行现场运行测试;代码与配置示例需结合实际版本、权限和环境验证。

延伸阅读

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台