【问题标题】:SSL_read fails 2nd timeSSL_read 第二次失败
【发布时间】:2012-07-02 21:43:29
【问题描述】:

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

1) 连接到服务器 WORKS

2) 握手工作

3) 第一个请求有效

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

【问题讨论】:

    标签: java openssl ssl


    【解决方案1】:

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

    【讨论】:

    • 我很清楚数据包碎片,这不是它。
    • @justonemailjustonemail 我没有说任何关于数据包碎片的事情。鉴于您正在提出问题,您无法确定什么是答案,什么不是答案。是你的代码不起作用,不是我的。
    猜你喜欢
    • 2013-12-17
    • 2020-10-02
    • 2011-03-22
    • 2015-09-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 2015-09-02
    • 2014-07-12
    相关资源
    最近更新 更多