SSL_read第二次失败

时间:2012-07-02 21:43:30

标签: java openssl ssl

我有一个openssl客户端谈论ssl。客户端之前正在与openssl服务器通话,一切都很好,花花公子。我们现在用java重写服务器,我们发现以下情况。

1)连接到服务器WORKS

2)握手WORKS

3)第一次请求工作

4)第一回应工作

5)第二次请求工作

6)第二次回复失败

7)第3次请求工作

8)第3次回复失败

第二个响应是大约130字节加密和(应该)大约100字节未加密。客户端正在从tcp套接字中成功读取所有这130个字节,但在放入SSL_read(如第一个响应)之后,它只输出1个字节。调用SSL_get_error后没有错误...只返回1个字节成功。我之后直接调用SSL_pending并返回0.

第3个响应现在返回-1 SSL_ERROR_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

1 个答案:

答案 0 :(得分:1)

你依赖的是你不能依赖的东西。 Java可以将响应缓冲到其SSL层中,这将导致接收到不同长度的SSL消息。您不能依赖于SSL或TCP上任何读取的长度,它们是字节流协议,在SSL的情况下至少在API级别。你必须循环阅读,直到你拥有所需的一切。