这是关于客户端服务器通信中的 openssl 重新协商问题。openssl 版本是 1.0.1c。
客户端和服务器正在使用阻塞套接字建立 SSL 连接,通信正常。客户端发送数据,服务器接收并发送回客户端。
当服务器想要重新协商时,使用 SSL_renogotiate,SSL_do_handshake 将 SSL 状态设置为 SSL_ST_ACCEPT。
客户端的一般行为是在控制台上等待使用 SSL_write 读取数据以将其发送到服务器。在此期间,如果服务器重新协商并且客户端通过调用 SSL_write 从控制台发送任何数据,则重新握手失败。
以下行在服务器端打印,从第二个 SSL_do_handshake 返回 -1
3086063264:错误:140940F5:SSL 例程:SSL3_READ_BYTES:意外记录:s3_pkt.c:1404:
以下行在客户端使用 SSL_read 读取时打印,在向服务器发送数据后返回 -1
3086079648:错误:140943F2:SSL 例程:SSL3_READ_BYTES:sslv3 警报意外消息:s3_pkt.c:1251:SSL 警报编号 10 3086079648:错误:140940E5:SSL 例程:SSL3_READ_BYTES:ssl 握手失败:s3_pkt.c:1151:
在 openssl.org 中给出了以下阻塞套接字
如果底层 BIO 阻塞,则 SSL_write() 只会在写入操作完成或发生错误后返回,除非发生重新协商,在这种情况下可能会发生 SSL_ERROR_WANT_READ。
当 SSL_write 接收 SSL 重新协商时,它在 clint 端的行为究竟如何。在这种情况下,如何重新握手成功。
问候, Pradeep