带有自定义服务器的SSL_ERROR_RX_RECORD_TOO_LONG

Mat*_*aun 5 java ssl

我已经创建了基于套接字的Web服务器。它可以通过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字节),像这样
  • 使用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
Run Code Online (Sandbox Code Playgroud)

是cURL和Firefox的Wireshark捕获。


为了重现错误,请执行

git clone git@gitlab.com:bullbytes/simple_socket_based_server.git
cd simple_socket_based_server
./gradlew run
Run Code Online (Sandbox Code Playgroud)

这将在启用TLS的情况下启动服务器。然后,在浏览器中打开以下URL(第一次时,您必须为自签名证书添加例外):

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
Run Code Online (Sandbox Code Playgroud)

为使自己确信禁用TLS后传输映像成功,请按以下方式启动服务器:

git clone git@gitlab.com:bullbytes/simple_socket_based_server.git
cd simple_socket_based_server
./gradlew run
Run Code Online (Sandbox Code Playgroud)

s从协议中删除后,图像应显示在浏览器中:

https://localhost:8443/ada.jpg
Run Code Online (Sandbox Code Playgroud)

服务器的请求处理循环在此处

如何进一步调试并修复它?


我在使用OpenJDK 12.0.2 + 10的Arch Linux 5.2.9上。

Mat*_*aun 5

这是JDK中的错误

在JDK 13中已修复¹。

原来的错误报告是这里的标题

TLSv1.3可能会生成超过2 ^ 14 + 1个字节的TLSInnerPlainText

这与问题中的观察结果一致:记录长于该记录违反了TLSv1.3协议。

该错误报告指出,通过此commit在JDK 11.0.5 b01和13中修复了Java的TLS实现。

通常,JDK 13重新实现 Socket并变“ ServerSocket²”,使其与Loom项目中引入的光纤配合使用。

我为JDK 12提交的错误在这里

解决方法

如果您无法升级JDK,则可以暂时使用ServerSocketChannel代替ServerSocket码头做到了。


¹ 在Arch Linux上使用OpenJDK build 13 + 33不会发生此错误:图像在Firefox中显示正常

² 用于重现错误的服务器是基于构建的ServerSocket