0

我有一个openssl 客户端在说ssl。客户端之前正在与 openssl 服务器通信,一切都很好而且很花哨。我们现在正在用 java 重写服务器,我们看到了以下情况。

1) 连接到服务器 WORKS

2)握手工作

3) 第一个请求 WORKS

4) 第一反应有效

5)第二次请求工作

6)第二次响应失败

7) 第三次请求有效

8) 第三次响应失败

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

第三个响应现在返回 -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
4

1 回答 1

1

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

于 2012-07-02T23:37:08.207 回答