gpt4 book ai didi

java - 自定义服务器的 SSL_ERROR_RX_RECORD_TOO_LONG

转载 作者:搜寻专家 更新时间:2023-10-31 19:59:13 25 4
gpt4 key购买 nike

我创建了一个 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/
  • 获取较小的图像(6773 字节),如 this one通过使用 cURL、Firefox 和 Chromium 的 HTTPS
  • 使用 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是 cURL 和 Firefox 的 Wireshark 捕获。


要重现错误,请执行

git clone git@gitlab.com:bullbytes/simple_socket_based_server.git
cd simple_socket_based_server
./gradlew run

这将启动启用了 TLS 的服务器。然后,在您的浏览器中打开以下网址(第一次您必须为自签名证书添加异常(exception)):

https://localhost:8443/ada.jpg

要说服自己在禁用 TLS 时传输图像成功,请像这样启动服务器:

./gradlew run --args="--use-tls=no"

从协议(protocol)中删除 s 后,图像应该显示在您的浏览器中:

http://localhost:8443/ada.jpg

服务器的请求处理循环是here .

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


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

最佳答案

这是JDK中的一个bug

它已在 JDK 13 中修复¹。

原始错误报告是 here与标题

TLSv1.3 may generate TLSInnerPlainText longer than 2^14+1 bytes

这与问题中的观察结果一致:比 violates 长的记录TLSv1.3 协议(protocol)。

This bug report声明 Java 的 TLS 实现已通过 this commit 在 JDK 11.0.5 b01 和 13 中得到修复.

一般来说,JDK 13 reimplemented SocketServerSocket²,使它们能够很好地与 project Loom 中引入的纤程配合使用.

我为 JDK 12 提交的错误是 here .

解决方法

如果在您的情况下无法升级 JDK,您可以使用 ServerSocketChannel而不是 ServerSocket 现在。 Jetty这样做。


¹Arch Linux 上的 OpenJDK build 13+33 不会出现此错误:图像在 Firefox 中显示正常

²<子> The server用于重现错误的是构建在 ServerSocket 上的。

关于java - 自定义服务器的 SSL_ERROR_RX_RECORD_TOO_LONG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57679669/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com