在服务器端获取 SSL 错误 SSL_ERROR_RX_RECORD_TOO_LONG

Posted

技术标签:

【中文标题】在服务器端获取 SSL 错误 SSL_ERROR_RX_RECORD_TOO_LONG【英文标题】:Get SSL error SSL_ERROR_RX_RECORD_TOO_LONG in server side 【发布时间】:2019-05-28 10:44:40 【问题描述】:

我已经用 C# 编写了自己的网络服务器。

而且我总是在端口 443 上的新 IP 中为我的网站建立 SSL 证书。而且它总是可以正常工作。

但是这次我得到了这个错误:

安全连接失败

连接到 www.sayehrooshan-co.com 时出错。 SSL 收到超过最大允许长度的记录。错误代码:

SSL_ERROR_RX_RECORD_TOO_LONG

无法显示您尝试查看的页面,因为无法验证接收到的数据的真实性。 请联系网站所有者,告知他们此问题。

这是页面地址:

https://www.sayehrooshan-co.com

这是我的代码总是与其他网站的 .pfx 文件一起使用:

sslstream = new SslStream(new NetworkStream(mySocket, false), false);
//commented for nedaye arzhang
X509Certificate2 serverCertificate = new X509Certificate2(Path, Password);
//X509Certificate2 serverCertificate = new X509Certificate2("www_nedaye-arzhang_com.cer");                           

sslstream.AuthenticateAsServer(serverCertificate, false, System.Security.Authentication.SslProtocols.Tls, true);

搜索了很多,但没有得到任何解决方案 有人知道吗?

【问题讨论】:

【参考方案1】:

Grasshopper 有同样的问题可能是因为两个路由器和 dns 绑定安装在一个 IP 地址和另一个 ssl mod 上。 Apache2 状态已启动并像魅力一样运行的事实告诉我这是一个安装/操作错误。明天又是一天。

【讨论】:

【参考方案2】:

服务器坏了。尝试使用openssl s_client 表明 TLS 握手已成功完成并且证书很好,但它在通信后期中断:

$ openssl s_client -connect www.sayehrooshan-co.com:443 -servername www.sayehrooshan-co.com -crlf
CONNECTED(00000003)
...
SSL-Session:
    Protocol  : TLSv1
    Cipher    : ECDHE-RSA-AES256-SHA
    ...
    Verify return code: 0 (ok)
---
GET / HTTP/1.1
Host: www.sayehrooshan-co.com

140040623380160:error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number:s3_pkt.c:365:

在实验过程中抓包可以看到服务器在 TLS 连接上发送纯文本:

> various TLS encrypted stuff from client (likely HTTP request) ....
< followed by sudden plain text from the server:
   Cannot find table 0.

   at System.Data.DataTableCollection.get_Item(Int32 index)
   at MyWebServerNamespace.MyWebServer.SetTableRowValue(DataSet& ds, String type, String name, String value) in D:\iteration source - table 13 removed\MyWebServer\MyWebServer.cs:line 4024
   at MyWebServerNamespace.MyWebServer.LoadCmsValues(Content cms, Ssl sslClass, DataSet& Ds, DataTable& fileDt, Socket& mySocket, Byte[]& contentBytes, Boolean& showCmsError) in D:\iteration source - table 13 removed\MyWebServer\MyWebServer.cs:line 1761
   at MyWebServerNamespace.MyWebServer.HandleTcpRequest(Object state) in D:\iteration source - table 13 removed\MyWebServer\MyWebServer.cs:line 1027
LoadCmsValues enter

客户端将尝试将此纯文本消息解释为 TLS 记录。这意味着它将解析初始字节并提取 TLS 协议版本和有效负载长度。鉴于这根本不是 TLS 记录,所有这些值都是垃圾。根据客户端中 TLS 堆栈的实际实现,这将导致错误消息,如 “错误版本号”(不支持声称的 TLS 协议版本)或 “SSL_ERROR_RX_RECORD_TOO_LONG”(指定的负载长度不是负载的实际长度)或更通用的“ERR_SSL_PROTOCOL_ERROR”或类似的。

【讨论】:

非常感谢。分析我的代码并显示那些行,让我的眼睛闪闪发光,我的代码中有问题,我已经开始远程调试并找到错误。节省了我很多时间;)【参考方案3】:

不只是 C#,Firefox 显示相同的错误消息。

“错误代码:ssl_error_rx_record_too_long。这通常意味着您的服务器上的 SSL 实现不正确。该错误通常是由服务器管理员需要调查的服务器端问题引起的。”

Source

Another page discussing this issue

火狐:

IE

【讨论】:

看起来不像是我的答案。 用浏览器进入页面查看。这似乎是一个错误的 SSL 证书。 @UweKeim 我已经编辑了我的答案,添加了 Firefox、Chrome 和 IE 屏幕热点,显示由于服务器端 SSL 错误而无法加载页面。问题表明代码运行良好。可能服务器最近更新了SSL证书,和c#无关,应该在网站的服务器端修复。 @Crick3t 我已经通过此链接检查了证书:sslshopper.com/ssl-checker.html#hostname=https://… 有任何人能理解的问题吗? @Hamed_gibago 你可以试试这个网站,它显示了更多细节:link

以上是关于在服务器端获取 SSL 错误 SSL_ERROR_RX_RECORD_TOO_LONG的主要内容,如果未能解决你的问题,请参考以下文章

AFNetworking - SSL - 添加了 .cer 文件,但在服务器端出现 400 错误

node-request - 获取错误“SSL23_GET_SERVER_HELLO:未知协议”

urllib.error.URLError: <urlopen 错误 [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败:无法获取本地颁发者证书 (_ssl.c:11

LibreSSL SSL_read: SSL_ERROR_SYSCALL git 代理引发失败

ActiveMQ配置ssl安全连接

如何解决 javax.net.ssl.SSLHandshakeException 错误?