Я отредактировал свой код, и теперь он выглядит так.Сервер пытается записать несколько байтов в сокет.
int r;
FILE *fp;
fp = stderr;
const SSL_METHOD *method;
method = SSLv23_server_method();
ERR_clear_error();
if ( !ctx)
{
ctx = SSL_CTX_new(method);
if (!ctx) {
return 0;
}
SSL_CTX_set_ecdh_auto(ctx, 1);
if (SSL_CTX_use_certificate_file(ctx, "/home/cert.pem", SSL_FILETYPE_PEM) <= 0) {
ERR_print_errors_fp(fp);
}
if (SSL_CTX_use_PrivateKey_file(ctx, "/home/key.pem", SSL_FILETYPE_PEM) <= 0 ) {
ERR_print_errors_fp(fp);
}
}
if (!ctx) {
return;
}
SSL *ssl;
ssl = SSL_new(ctx);
SSL_set_fd(ssl, fd);
ERR_clear_error();
if (SSL_accept(ssl) <= 0) {
ERR_print_errors_fp(fp);
}
int rce = 0;
ERR_clear_error();
char *buffer = (char *) malloc(iova.iov_len);
memcpy(buffer, iova.iov_base, iova.iov_len);
r = SSL_write(ssl, buffer, (int)iova.iov_len);
// check how many bytes were written
if ( r <= 0 )
{
ERR_print_errors_fp(fp);
int err = errno;
switch(SSL_get_error(ssl,r)){
case SSL_ERROR_NONE:
continue;
case SSL_ERROR_ZERO_RETURN:
syslog(LOG_INFO, "SSL read encountered an error %d. Peer disconnected.", SSL_ERROR_ZERO_RETURN);
break;
case SSL_RECEIVED_SHUTDOWN:
syslog(LOG_INFO, "SSL read encountered an error %d. Shutdown.", SSL_RECEIVED_SHUTDOWN);
break;
case SSL_ERROR_SYSCALL:
syslog(LOG_INFO, "SSL write encountered an error %d and %lu. SYSCALL", SSL_get_error(ssl,r), ERR_get_error());
break;
default:
syslog(LOG_INFO, "SSL write encountered an error %d and %d. Quitting", SSL_get_error(ssl,r), err);
break;
}
Пара проблем, которые я не смог выяснить -
SSL_accept () не удается
Затем SSL_write () завершается ошибкой с SSL_RECEIVED_SHUTDOWN и ошибкой строки = error:00000002:lib(0):func(0):system lib
Что я здесь не так делаю с SSL_accept
и SSL_write()
?
Я пытаюсь использовать Openssl для выполнения SSL_write()
, и я получаю следующую ошибку во время SSL_write()
.Сервер пытается записать несколько байтов в сокетное соединение fd
-
error:140D0114:SSL routines:SSL_write:uninitialized:ssl_lib.c:1039:
Error: error:00000005:lib(0):func(0):DH lib
Вот мой код
SSL *ssl;
if ( !ctx )
return 0;
ssl = SSL_new(ctx);
//SSL_set_fd(ssl, fd);
BIO *sbio = NULL;
sbio = BIO_new_socket(fd, BIO_NOCLOSE);
SSL_set_bio(ssl, sbio, sbio);
ERR_clear_error();
FILE *fp;
fp = stderr;
r = SSL_write(ssl, buffer, (len);
if ( r <= 0 )
{
ERR_print_errors_fp(fp);
switch(SSL_get_error(ssl,r)){
case SSL_ERROR_NONE:
syslog(LOG_INFO, "No real error. Continue.");
continue;
case SSL_ERROR_ZERO_RETURN:
syslog(LOG_INFO, "SSL read encountered an error %d. Peer disconnected.", SSL_ERROR_ZERO_RETURN);
break;
case SSL_RECEIVED_SHUTDOWN:
syslog(LOG_INFO, "SSL read encountered an error %d. Shutdown.", SSL_RECEIVED_SHUTDOWN);
break;
case SSL_ERROR_SYSCALL:
syslog(LOG_INFO, "SSL write encountered an error %d and %lu. SYSCALL", SSL_get_error(ssl,r), ERR_get_error());
break;
default:
syslog(LOG_INFO, "SSL write encountered an error %d and %d. Quitting", SSL_get_error(ssl,r), err);
break;
}
Контекст SSL (ctx) действителен с самого начала.
Я попытался найти объяснение ошибки, но не нашел ее.Также я не нашел подобную проблему, которая бы разрешила ее.Может ли кто-нибудь помочь мне понять, что я могу сделать для дальнейшей отладки этого?Или если у них есть решение?
Openssl версия 1.0.2g