java - SSL_read 第二次失败

标签 java openssl ssl

我有一个使用 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 可能会将响应以不同方式缓冲到其 SSL 层中,这将导致接收到不同长度的 SSL 消息。您不能依赖通过 SSL 或 TCP 进行的任何读取的长度,它们是字节流协议(protocol),至少在 API 级别的 SSL 情况下。您必须循环阅读,直到获得所需的一切。

关于java - SSL_read 第二次失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11301614/

相关文章:

java - 如何检测 Minecraft forge 1.16.5 中任何被破坏的方 block

java - 父类中的子实例

java - 在 Android 中转换 AsyncTask

java - 使用 Java 生成证书、公钥和私钥

amazon-web-services - Amazon CloudFront 和 HTTPsL 我该怎么办?

java - SSL 异常 : "received close_notify during handshake" upon initializing Alexa Skill Management API (SMAPI)

bash - Debian:使用 TCP 的 Bash 电子邮件

c# - OpenSSL 代码 native 工作,但作为 DLL 导致 OPENSSL_Uplink : no OPENSSL_Applink

ssl - 什么是 CA 证书,我们为什么需要它?

python - Tornado MySQLDB SSL 连接