我有一个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
答案 0 :(得分:1)
你依赖的是你不能依赖的东西。 Java可以将响应缓冲到其SSL层中,这将导致接收到不同长度的SSL消息。您不能依赖于SSL或TCP上任何读取的长度,它们是字节流协议,在SSL的情况下至少在API级别。你必须循环阅读,直到你拥有所需的一切。