Java SSL Streaming - 拆分应用程序数据

标签 java networking ssl streaming

我尝试通过已建立的 SSL 连接发送一个 byte[] ()(握手等已完成)。

结果:byte[] 被吐入两个数据包(参见下面的调试):

  • 第一个数据包:只是应用程序数据的第一个字节 (**01**) 。
  • 第二个数据包:其余 (fe db 01 00 ...) 650 字节

有没有办法在一个数据包中提交所有应用程序数据字节?

要发送 651 字节的流:

**01** fe db 01 00 00 02 83 3c 3f 78 6d 6c 20 76 65 72 73 69 6f 6e 3d 22 31 2e 30 22 20 65 6e 63 6f 64 69 6e 67 3d 22 75 73 2d 61 73 63 69 69 22 20 73 74 61 6e 64 61 6c 6f 6e 65 3d 22 6e 6f 22 3f 3e …

javax.net.debug 输出

Padded plaintext before ENCRYPTION:  len = 32
0000: **01** 06 03 06 46 7F 7F AE   D4 E8 30 5D B7 DB 3C 44  ....F.....0]..<D
0010: 02 08 C9 2A A1 0A 0A 0A   0A 0A 0A 0A 0A 0A 0A 0A  ...*............
1, WRITE: TLSv1 Application Data, length = 32
[Raw write]: length = 37
0000: 17 03 01 00 20 B3 4E EE   CE 5B 69 EC A5 4A 80 7F  .... .N..[i..J..
0010: D6 03 35 AF 6A 7B 85 17   B7 46 A2 31 B2 EF 7E D0  ..5.j....F.1....
0020: EA 1B 67 7E ED                                     ..g..
Padded plaintext before ENCRYPTION:  len = 672
0000: FE DB 01 00 00 02 83 3C   3F 78 6D 6C 20 76 65 72  .......<?xml ver
0010: 73 69 6F 6E 3D 22 31 2E   30 22 20 65 6E 63 6F 64  sion="1.0" encod
0020: 69 6E 67 3D 22 75 73 2D   61 73 63 69 69 22 20 73  ing="us-ascii" s
0030: 74 61 6E 64 61 6C 6F 6E   65 3D 22 6E 6F 22 3F 3E  tandalone="no"?>
[…]

最佳答案

Sun 的 impl 评论:

By default, we counter chosen plaintext issues on CBC mode ciphersuites in SSLv3/TLS1.0 by sending one byte of application data in the first record of every payload, and the rest in subsequent record(s). Note that the issues have been solved in TLS 1.1 or later.

SSLEngine.wrap( largePlainText ) 的实验表明它产生了 2 个 SSL 记录,第一个记录包含 1 个字节的纯文本,第二个记录包含 15846 个字节的纯文本。

接收器 API 可能会逐个记录地处理,因此它会在第一次读取时返回 1 个字节。

我们也可以在其他 SSL impls 中观察到这种行为,例如来自 Web 浏览器的 HTTPS 请求。

OpenSSL 插入空记录来对抗攻击。如果接收器是 Java SSL 套接字,则输入流不能为 read() 返回 0 字节,因此跳过该记录。其他接收器可能没有准备好接收长度为 0 的记录,可能会中断。

关于Java SSL Streaming - 拆分应用程序数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13528021/

相关文章:

java - 未捕获的类型错误 : Cannot read property 'action' of null

java - 无法运行自解压安装程序-无法访问jarfile C :\Users\Ray\AppData\Local\Temp\RarSFX0\install. jar

java - 如何附加两个文件,它说要连接它们,但它无法正常工作,并且我不断收到错误

ruby-on-rails - 来自 react 应用程序的带有 JSON 有效负载的 HTTP POST 请求返回 net::ERR_SSL_PROTOCOL_ERROR(chrome)

django - python_ldap |在变量中提供证书内容

Java 8 具有 Stream API、Lambda 以及与 java 7 的简洁代码比较

java - 检查连接速度的库

c - 包装函数的目的

c# - arp -a 和路由打印

java - 使用 TLSV1 的 cxf webclient 调用 api