我已经创建了基于套接字的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 -Ok "https://localhost:8443/ada.jpg"https://localhost:8443/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上。
在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。
| 归档时间: |
|
| 查看次数: |
223 次 |
| 最近记录: |