Это касается проблемы повторного согласования 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. Как в таком случае может быть успешным повторное встряхивание?
С уважением, Прадип