Я пытаюсь создать приложение клиент / сервер TLS1.2, которое аутентифицируется с помощью OpenSSL. Я пытаюсь добавить возможность, чтобы соединение между клиентом и сервером не шифровалось
Я пытался добиться этого, установив для шифра значение NULL.
Это инициализациякод для контекста OpenSSL как на клиенте, так и на сервере.
Клиент:
SSL_CTX* InitCTX(const char * certificate, bool verify)
{
const SSL_METHOD *method;
SSL_CTX *ctx;
OpenSSL_add_all_algorithms(); /* Load cryptos, et.al. */
SSL_load_error_strings(); /* Bring in and register error messages */
method = TLSv1_2_client_method();// SSLv23_client_method(); /* Create new client-method instance */
ctx = SSL_CTX_new(method); /* Create new context */
if (ctx == NULL)
{
ERR_print_errors_fp(stderr);
abort();
}
/* configure context */
int mode = verify ? SSL_VERIFY_PEER : SSL_VERIFY_NONE;
SSL_CTX_set_verify(ctx, mode, nullptr);
//SSL_CTX_set_cipher_list(ctx, "aNULL:eNULL");
if (!SSL_CTX_set_cipher_list(ctx, "NULL")) {
std::cerr << "Error setting ciphers" << std::endl;
exit(1);
}
// SSL_CTX_set_verify_depth(ctx, 4);
if (!SSL_CTX_load_verify_locations(ctx, certificate, NULL))
{
printf("Failed to load root CA certificate.");
exit(1);
}
return ctx;
}
Сервер:
SSL_CTX* InitServerCTX(bool verify)
{
const SSL_METHOD *method;
SSL_CTX *ctx;
OpenSSL_add_all_algorithms(); /* load & register all cryptos, etc. */
SSL_load_error_strings(); /* load all error messages */
method = TLSv1_2_server_method();// SSLv23_server_method(); /* create new server-method instance */
ctx = SSL_CTX_new(method); /* create new context from method */
if (ctx == NULL)
{
ERR_print_errors_fp(stderr);
abort();
}
const int mode = verify ? SSL_VERIFY_PEER : SSL_VERIFY_NONE;
SSL_CTX_set_verify(ctx, mode, nullptr);
SSL_CTX_set_cipher_list(ctx, "NULL");
return ctx;
}
void LoadCertificates(SSL_CTX* ctx, char* CertFile, char* KeyFile)
{
/* set the local certificate from CertFile */
if (SSL_CTX_use_certificate_file(ctx, CertFile, SSL_FILETYPE_PEM) <= 0)
{
ERR_print_errors_fp(stderr);
abort();
}
/* set the private key from KeyFile (may be the same as CertFile) */
if (SSL_CTX_use_PrivateKey_file(ctx, KeyFile, SSL_FILETYPE_PEM) <= 0)
{
ERR_print_errors_fp(stderr);
abort();
}
/* verify private key */
if (!SSL_CTX_check_private_key(ctx))
{
fprintf(stderr, "Private key does not match the public certificate\n");
abort();
}
}
Я ожидаю, что смогу создать TLS 1.2соединение, которое не шифрует. Вместо этого я получаю следующие ошибки при попытке соединения:
Клиент:
"ошибка: 141A90B5: Подпрограммы SSL: ssl_cipher_list_to_bytes: нет доступных шифров: ssl \ statem \ statem_clnt.c: 3804: Нет шифроввключено для максимальной поддерживаемой версии SSL / TLS "
Сервер:
" Ошибка: 14094438: подпрограммы SSL: ssl3_read_bytes: внутренняя ошибка предупреждения tlsv1: ssl \ record \ rec_layer_s3.c: 1536: предупреждение SSLномер 80 "
Было бы неплохо, если бы я смог добиться этого и в TLS 1.3, но сейчас я благодарен за помощь для TLS 1.2