Повторное согласование SSL в openssl с использованием блокирующих сокетов

Это касается проблемы повторного согласования openssl при обмене данными между клиентом и сервером. Версия openssl - 1.0.1c.

Клиент и сервер устанавливают 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_BYTES: сбой установления связи ssl: s3_p51

В openssl.org для блокировки сокетов дается следующее

Если базовый BIO блокируется, SSL_write () вернется только после завершения операции записи или возникновения ошибки, за исключением случаев повторного согласования, и в этом случае может возникнуть SSL_ERROR_WANT_READ.

Как именно SSL_write ведет себя на стороне clint, когда получает повторное обновление SSL. Как в таком случае может быть успешным повторное встряхивание?

С уважением, Прадип


person Keely Sexton    schedule 13.06.2012    source источник


Ответы (1)


SSL_write вернется в контексте блокировки, если базовый канал SSL требует операции чтения или записи для повторного согласования. Вы можете разрешить автоматическое повторное согласование SSL, используя SSL_set_mode с SSL_MODE_AUTO_RETRY. Этот флаг может быть установлен для каждого соединения или для CTX.

(документация)

person alanctgardner    schedule 21.08.2012