Я пишу неблокирующий клиент Websocket и использую OpenSSL для уровня TLS. Я могу подключиться к удаленному серверу, выполнить квитирование TLS, отправить запрос на обновление, получить подтвержденный ответ об обновлении и получить реальный ответ через веб-сокет, прежде чем уровень TLS отключится с SSL_ERROR_ZERO_RETURN
.
SSL_get_error(...)
возвращает: 6 // SSL_ERROR_ZERO_RETURN
ERR_error_string(ERR_get_error(), nullptr)
возвращает: error:00000000:lib(0):func(0):reason(0)
Насколько я понимаю, ERR_get_error()
должен появиться и вернуть первую ошибку в очередь ошибок, а SSL_get_error()
вернет последнюю ошибку функции SSL_*
. Я не понимаю, почему SSL_get_error()
возвращает значение ошибки, а ERR_get_error()
- нет. Согласно этому предыдущему вопросу переполнения стека , SSL_get_error()
НЕ вызывает ERR_get_error()
.
Следующий код вызывается повторно (поскольку это неблокирующий сокет):
ERR_clear_error();
int ret = SSL_read(...);
if (ret > 0) {
// read bytes from socket
} else {
int err_code = SSL_get_error(ssl_session_, ret);
if (err_code == SSL_ERROR_ZERO_RETURN || err_code == SSL_ERROR_SYSCALL || err_code == SSL_ERROR_SSL) {
sprintf("Disconnected: %d %s", err_code, ERR_error_string(ERR_get_error(), nullptr));
// Disconnect Code
}
}
У меня есть два вопроса:
Почему я не получаю значение ошибки для ERR_get_error ()?
Почему я так быстро отключаюсь после установления сеанса TLS и Websocket?
РЕДАКТИРОВАТЬ 1
Я использовал wireshark для захвата пакетов между клиентом и сервером. Я подтвердил, что квитирование TLS, обновление веб-сокета и первоначальный ответ сервера прошли успешно. Я заметил, что после первоначального ответа сервера мой клиент получает Encrypted Alert 21
с сервера, который, по моему мнению, является фатальной ошибкой, и объясняет, почему сеанс TLS немедленно завершается, а моя очередь ошибок SSL пуста (хотя это, вероятно, проблема на стороне клиента, Я не думаю, что это результат недавнего действия), и как бы объясняет значение SSL_ERROR_ZERO_RETURN
, которое я получаю после SSL_Read
.
Я не уверен, что влечет за собой Encrypted Alert 21
. Это может быть сертификат, который я использую (самоподписанный). Нужно расследовать дальше.