Java SSL_读取第二次失败

Java SSL_读取第二次失败,java,openssl,ssl,Java,Openssl,Ssl,我有一个openssl客户端在谈论ssl。客户机之前与openssl服务器进行了对话,一切都很好。我们现在正在用java重写服务器,我们看到了以下情况 1) 连接到服务器工作 2) 握手有效 3) 第一个请求有效 4) 第一反应工程 5) 第二个请求有效 6) 第二次响应失败 7) 第三个请求有效 8) 第三个响应失败 第二个响应大约是130字节加密的,而(应该)大约是100字节未加密的。客户端正在成功地从tcp套接字读取所有这130个字节,但在将其放入SSL_read(如First respo

我有一个openssl客户端在谈论ssl。客户机之前与openssl服务器进行了对话,一切都很好。我们现在正在用java重写服务器,我们看到了以下情况

1) 连接到服务器工作

2) 握手有效

3) 第一个请求有效

4) 第一反应工程

5) 第二个请求有效

6) 第二次响应失败

7) 第三个请求有效

8) 第三个响应失败

第二个响应大约是130字节加密的,而(应该)大约是100字节未加密的。客户端正在成功地从tcp套接字读取所有这130个字节,但在将其放入SSL_read(如First respone)后,它只输出1个字节。调用SSL\u get\u error后没有错误…仅成功返回1个字节。之后我直接调用SSL_pending,它返回0

第三个响应现在返回-1 SSL\u错误\u SSL“解密失败或错误记录mac”

我是openssl的新手,我已经和这个问题争论了好几个小时了。任何想法都将不胜感激

更新:相关代码

...
BIO* bio = BIO_new_mem_buff(sbuf, bufoutlen);
BIO_set_mem_close(bio,BIO_NOCLOSE);
ssl->rbio=bio;
int len = SSL_read(ssl, bufout, sbuflen); //<<return 1 even though buf has 130bytes
printf("pending=%d\n",SSL_pending(ssl)); //<<returns 0
。。。
BIO*BIO=BIO_new_mem_buff(sbuf,bufoutlen);
BIO_设置_mem_关闭(BIO,BIO NOCLOSE);
ssl->rbio=bio;

int len=SSL_read(SSL、bufout、sbuflen)// 你依赖的是你不能依赖的东西。Java可能会将响应以不同的方式缓冲到其SSL层中,这将导致接收到不同长度的SSL消息。您不能依赖任何通过SSL或TCP的读取的长度,它们是字节流协议,在SSL的情况下,至少在API级别。你必须在循环中阅读,直到你得到你需要的一切。

我很清楚数据包碎片,不是这样。@justonemailjustonemail我没有说任何关于数据包碎片的事情。考虑到你在问这个问题,你无法确定什么是答案,什么不是答案。是你的代码不起作用,不是我的。