Я использую 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-соединения нет. Существует принятый сокет открытого текста, который необходимо закрыть.