Я использую OpenSSL (библиотеку разработки, <openssl/ssl.h>) для программирования небольшого простого сервера на C.
Поскольку я тестирую его только локально, я использую самозаверяющий сертификат. При первом подключении, поскольку мой браузер не доверяет сертификату, SSL_accept() возвращает SSL_ERROR_SSL, и это нормально, так и должно произойти.
Мне интересно, как мне справиться с ошибкой SSL_ERROR_SSL, поскольку в документации SSL_get_error() говорится:
SSL_ERROR_SSL
Произошла неустранимая фатальная ошибка в библиотеке SSL, обычно это ошибка протокола. Очередь ошибок OpenSSL содержит дополнительную информацию об ошибке. Если возникает эта ошибка, то дальнейшие операции ввода-вывода не должны выполняться в соединении и не следует вызывать SSL_shutdown().
Если я не могу SSL_shutdown(), что мне делать с SSL-соединением? Как мне повторно использовать объект SSL*? И почему я не могу вызвать SSL_shutdown()?
Я попытался просмотреть очередь ошибок, которая выдала ожидаемую ошибку ненадежного сертификата. На сайте OpenSSL нет ответов, и похоже, что большинство программ стараются не решать эту проблему, а избегать ее решения.





В случае обнаружения ненадежного сертификата функция SSL_accept(), возвращающая SSL_ERROR_SSL, сигнализирует о необратимой, катастрофической проблеме в библиотеке SSL, обычно об ошибке протокола.
В этом сценарии не следует вызывать SSL_shutdown(), а также выполнять какие-либо действия ввода-вывода в соединении.
Чтобы решить эту проблему и продолжить использование объекта SSL*, вы можете предпринять следующие действия:
Чтобы привести в порядок объект SSL, выполните SSL_free(ssl), чтобы освободить выделенные ресурсы, связанные с объектом SSL. В результате сеанс SSL и все связанные структуры данных будут освобождены.
Закройте базовый сокет. Чтобы освободить системные ресурсы, закройте дескриптор сокета, подключенный к SSL-соединению. Для этого вы можете использовать функции Shutdown() или Close().
Отвечайте на ошибку вежливо.
Этот ответ читается так, как будто его сгенерировал ИИ, что запрещено в StackOverflow: stackoverflow.com/help/gen-ai-policy
Если я не могу
SSL_shutdown(), что мне делать с SSL-соединением? Как мне повторно использовать объектSSL*? И почему я не могу вызватьSSL_shutdown()?
В этом случае вы не можете использовать SSL_shutdown(), поскольку это неустранимая фатальная ошибка. Сеанс SSL не удалось установить, состояние сокета неизвестно. Так что нет ничего, что можно было бы надежно отключить. И объект SSL нельзя использовать повторно.
Итак, единственное, что вы можете сделать, это уничтожить объект SSL, закрыть сокет и двигаться дальше.
SSL-соединения нет. Существует принятый сокет открытого текста, который необходимо закрыть.