使用阻塞套接字在openssl中进行SSL重新协商

时间:2012-06-13 09:17:02

标签: openssl

这是关于客户端服务器通信中的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 renogotiation时在clint端的行为如何。在这种情况下,重新握手如何取得成功。

此致 普拉迪普

1 个答案:

答案 0 :(得分:1)

如果底层SSL通道需要重新协商的读取或写入操作,

SSL_write将在阻塞上下文中返回。您可以使用SSL_set_mode SSL_MODE_AUTO_RETRY来允许SSL自动重新协商。可以为每个连接设置此标志,也可以在CTX上设置。

documentation