SSL_ERROR_RX_RECORD_TOO_LONG 与自定义服务器
Posted
技术标签:
【中文标题】SSL_ERROR_RX_RECORD_TOO_LONG 与自定义服务器【英文标题】:SSL_ERROR_RX_RECORD_TOO_LONG with custom server 【发布时间】:2019-12-31 22:18:40 【问题描述】:我创建了一个基于套接字的web server。它可以通过 HTTPS 或 HTTP 提供文件。
我遇到的问题是在使用 Firefox 和 Chromium 通过 HTTPS 从服务器请求文件(例如图像)时发生的。
当 Firefox 从https://localhost:8443/ada.jpg
的服务器请求图像时,Firefox 会报告
SSL_ERROR_RX_RECORD_TOO_LONG
同样,Chromium 错误与
ERR_SSL_PROTOCOL_ERROR
以下工作正常:
cURL 通过 HTTPS 获取图像:curl -Ok "https://localhost:8443/ada.jpg"
使用 cURL、Firefox 和 Chromium 通过 HTTPS 获取文本响应:https://localhost:8443/
使用 cURL、Firefox 和 Chromium 通过 HTTPS 获取更小的图像(6773 字节),例如 this one
使用 cURL、Firefox 和 Chromium 通过 HTTP(无 TLS)获取图像:http://localhost:8443/ada.jpg
我使用 Wireshark 在浏览器获取图像时查看帧:Firefox 和 Chromium 都会在图像仍在传输时向服务器发送[FIN, ACK]
帧。服务器继续发送部分图像,之后浏览器发送一个[RST]
帧。
这些是 Firefox 和服务器之间交换的最后几帧:
25 1.873102771 ::1 ::1 TCP 86 55444 → 8443 [ACK] Seq=937 Ack=18043 Win=56704 Len=0 TSval=3976879013 TSecr=3976879013
26 1.873237965 ::1 ::1 TLSv1.3 110 Application Data
27 1.873247272 ::1 ::1 TCP 86 8443 → 55444 [ACK] Seq=18043 Ack=961 Win=65536 Len=0 TSval=3976879013 TSecr=3976879013
28 1.873346910 ::1 ::1 TCP 86 55444 → 8443 [FIN, ACK] Seq=961 Ack=18043 Win=65536 Len=0 TSval=3976879013 TSecr=3976879013
29 1.876736432 ::1 ::1 TLSv1.3 16508 Application Data
30 1.876769660 ::1 ::1 TCP 74 55444 → 8443 [RST] Seq=962 Win=0 Len=0
Here 是 Wireshark 捕获的 cURL 和 Firefox。
为了重现错误,请执行
git clone git@gitlab.com:bullbytes/simple_socket_based_server.git
cd simple_socket_based_server
./gradlew run
这将启动启用了 TLS 的服务器。然后,在浏览器中打开以下 URL(第一次您必须为自签名证书添加例外):
https://localhost:8443/ada.jpg
要说服自己在禁用 TLS 时传输图像成功,请像这样启动服务器:
./gradlew run --args="--use-tls=no"
从协议中删除s
后,图像应该会显示在您的浏览器中:
http://localhost:8443/ada.jpg
服务器的请求处理循环是here。
如何进一步调试并修复它?
我在 Arch Linux 5.2.9 上使用 OpenJDK 12.0.2+10。
【问题讨论】:
您是否已经检查过这个:***.com/questions/119336/… ? 是的,我做到了。该问题中描述的问题是 Apache 的错误配置,不符合我的问题中描述的症状,即在某些条件下通过 TLS 传输数据是有效的。 【参考方案1】:这是 JDK 中的一个错误
它已在 JDK 13 中修复¹。
原始错误报告为here,标题为
TLSv1.3 可能生成长于 2^14+1 个字节的 TLSInnerPlainText
这与问题中的观察结果一致:比violates TLSv1.3 协议更长的记录。
This bug report 声明 Java 的 TLS 实现通过this commit 在 JDK 11.0.5 b01 和 13 中得到修复。
通常,JDK 13 reimplementedSocket
和 ServerSocket
²,使它们与 project Loom 中引入的纤维配合得很好。
我为 JDK 12 提交的错误是 here。
解决方法
如果在您的情况下无法升级 JDK,您现在可以使用 ServerSocketChannel
而不是 ServerSocket
。 Jetty 就是这样做的。
¹在 Arch Linux 上的 OpenJDK build 13+33 不会出现该错误:图像在 Firefox 中显示正常
²用于重现错误的The server是建立在ServerSocket
之上的。
【讨论】:
以上是关于SSL_ERROR_RX_RECORD_TOO_LONG 与自定义服务器的主要内容,如果未能解决你的问题,请参考以下文章