2012-07-02 320 views
0

我有一个openssl客户端说话ssl。客户以前曾经与openssl服务器交谈过,一切都很好,很花哨。我们现在用java重写服务器,我们看到下面的情况。SSL_read第二次失败

1)连接到服务器WORKS

2)握手WORKS

3)第一请求WORKS

4)第一响应WORKS

5)第二请求WORKS

6 )第二回应失败

7)第三次要求EST WORKS

8)第三响应失败

的第二响应是有关加密130bytes和(应该是)周围100字节加密。客户端成功读取了tcp套接字中的所有130个字节,但在将SSL_read(如第1个响应)扔出后,它仅输出1个字节。调用SSL_get_error后没有错误...只有1个字节被成功返回。我叫SSL_pending直接事后并返回0

第三响应现在返回-1 SSL_ERROR_SSL“解密失败或不良记录MAC”

我是全新的,以OpenSSL和我一直都争夺这个问题了几个小时现在。任何想法,将不胜感激

UPDATE:相关代码

... 
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 

回答

1

你依靠的东西,你不能依赖。 Java可能会将响应缓存到其SSL层,这会导致接收到不同长度的SSL消息。您不能依赖任何通过SSL或TCP读取的长度,它们是字节流协议,对于至少在API级别的SSL而言。你必须循环阅读,直到你有你需要的一切。

+0

我很清楚数据包的碎片,这不是它。 –

+0

@justonemailjustonemail我没有说任何关于数据包碎片的事情。考虑到你提出这个问题,你无法确定什么是,哪些不是答案。这是你的代码不起作用,不是我的。 – EJP