这是关于客户端服务器通信中的openssl重新协商问题.openssl版本是1.0.1c。
客户端和服务器正在使用阻塞套接字建立SSL连接,通信正常。客户端发送数据,服务器接收并发送回客户端。
当服务器想要进行重新协商时,使用SSL_renogotiate,SSL_do_handshake在将SSL状态设置为SSL_ST_ACCEPT之后完成。
客户端的一般行为是在控制台上等待使用SSL_write将数据发送到服务器。在此期间,如果服务器重新协商并且客户端通过调用SSL_write从控制台发送任何数据,则重新握手失败。
在服务器端打印以下行,从第二个SSL_do_handshake
返回-13086063264:错误: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 renogotiation时在clint端的行为如何。在这种情况下,重新握手如何取得成功。
此致 普拉迪普
答案 0 :(得分:1)
SSL_write
将在阻塞上下文中返回。您可以使用SSL_set_mode
SSL_MODE_AUTO_RETRY
来允许SSL自动重新协商。可以为每个连接设置此标志,也可以在CTX
上设置。