Я использую OpenSSL 1.0.0-fips для Linux. Вопрос, который у меня возникает, заключается в том, что SSL_connect()
возвращается -1, а SSL_get_error()
возвращает SSL_ERROR_WANT_READ
. Затем я помещаю дескриптор файла в select()
с установкой timeval
, установленной на 10 секунд, и select()
просто отключается.Неблокирующий ввод-вывод с OpenSSL BIO
Я запустил Wireshark, и я вижу «Клиент Hello», и я вижу, что ServerHello
возвращается к клиенту, но он никогда не «просыпается» в select()
. Это просто время.
Мои вопросы:
Должен ли я создать объект BIO с использованием
BIO_new_socket()
и затем назначьте объект BIO для моего объекта SSL с помощьюSSL_set_bio()
? В справочной странице дляSSL_set_fd()
указано, что она автоматически создаст объект BIO, чтобы, по-видимому, было указано, чтоSSL_set_bio()
- это бесполезная функция, которую вам никогда не нужно звонить.Скажем, мы используем
SSL_set_fd()
и назначаем связанный файловый дескриптор TCP, который блокируется. Скажем, позже мы изменим этот файловый дескриптор на неблокирующий, используяfcntl()
. Разве это вообще нарушает объект SSL (или базовый объект BIO)?
Вероятно, вы должны указать некоторый код, включая настройку контекста. Асинхронный ввод-вывод и неблокирующие сокеты дают людям массу проблем, потому что библиотека не слишком удобна. Ознакомьтесь с исходным кодом для ['apps/ocsp.c'] (https://github.com/openssl/openssl/blob/master/apps/ocsp.c), чтобы узнать, как это работает OpenSSL. Кажется, я вспоминаю, что обычный контекст настроен в режиме блокировки, затем все переключается в неблокирующий режим с использованием основного сокета. Найдите код, который вызывает 'BIO_get_fd' и' select'. AFAIK, его единственный пример неблокирующего ввода-вывода в самодокументирующем коде :) – jww
Я не публиковал код, потому что вся функция соединения для моего реализованного класса C++ SSL Socket довольно велика. Однако я нашел свою проблему. Я забыл добавить 1 к аргументу maxfd для выбора(). –