2012-06-13 37 views
1

這是關於客戶端服務器通信中的openssl重新協商問題。openssl版本是1.0.1c。使用阻塞套接字在openssl中進行SSL重新協商

客戶端和服務器正在使用阻塞套接字建立SSL連接,並且通信正常。客戶端發送數據並且服務器接收併發送回客戶端。

當服務器想要重新協商時,使用SSL_renogotiate和SSL_do_handshake完成後,將SSL狀態設置爲SSL_ST_ACCEPT。

客戶端的一般行爲是在控制檯上等待讀取數據使用SSL_write發送到服務器。在此期間,如果服務器重新協商並且客戶端通過調用SSL_write從控制檯發送任何數據,則重新註冊失敗。

下面線在服務器側被印刷返回-1從第二SSL_do_handshake

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_B YTES:SSL握手失敗:s3_pkt.c:1151:

在openssl.org阻止插座下面給出

如果底層的BIO是阻塞,SSL_write()將只返回,一次寫操作已經完成或發生錯誤,除非重新協商發生,在這種情況下可能會發生SSL_ERROR_WANT_READ。

SSL_write在接收SSL虛擬轉換時如何在clint端行爲。在這種情況下,重新握手如何成功?

問候, 普拉迪普

回答

1

SSL_write將在阻擋上下文返回,如果底層SSL通道需要讀或重新談判寫操作。您可以通過使用SSL_set_modeSSL_MODE_AUTO_RETRY來允許SSL自動重新協商。該標誌可以設置每個連接,或在CTX

documentation