Missing private key for X.509 certificate

Пропавшие без вести ключевой силы приводят к ошибке времени выполнения или незащищенному шифрованию

Описание

Дефект происходит, когда вы загружаете файл сертификата X.509 в контекст SSL, но вы не загружаете соответствующий закрытый ключ, или ключ, который вы загружаете в контекст, является пустым.

Как правило, в обмене TLS/SSL, сервер удостоверяет свою личность во время квитирования TLS/SSL путем отправки сертификата X.509, который содержит информацию о сервере и открытом ключе. Клиент, который получает сертификат, использует открытый ключ, чтобы зашифровать и отправить предосновной секрет, который может только быть дешифрован с соответствующим закрытым ключом. Сервер использует дешифрованный предосновной секрет и другие обмененные сообщения, чтобы сгенерировать сеансовые ключи, которые используются, чтобы зашифровать сеанс связи.

Средство проверки не повышает дефекта если:

  • Вы передаете контекст SSL в качестве аргумента к функции, которая вызывает SSL_new.

  • Вы объявляете контекст SSL вне осциллографа функции, обрабатывающей связь.

Риск

Загрузка закрытого ключа для сертификата X.509 может привести к ошибке времени выполнения на незащищенном шифровании.

Фиксация

Загрузите закрытый ключ сертификата X.509 в контекст SSL путем вызова SSL_CTX_use_PrivateKey_file или загрузите закрытый ключ в структуру SSL путем вызова SSL_use_PrivateKey_file.

Примеры

развернуть все

#include <stdio.h>
#include <stdlib.h>
#include <openssl/ssl.h>
#define SSL_SERVER_CRT "server.pem"

#define fatal_error() exit(-1)

void load_cert(SSL_CTX* ctx, const char* certfile)
{
    int ret = SSL_CTX_use_certificate_file(ctx, certfile, SSL_FILETYPE_PEM);
    if (ret <= 0) fatal_error();
}

void func()
{
    int ret;
    SSL_CTX* ctx;
    SSL* ssl;

    /* creation context for the SSL protocol */
    ctx = SSL_CTX_new(SSLv23_server_method());
    if (ctx == NULL) fatal_error();

    /* context configuration */
    load_cert(ctx, SSL_SERVER_CRT);

    /* Handle connection */
    ssl = SSL_new(ctx);
    ret = SSL_accept(ssl);
    if (ret <= 0) fatal_error();

    SSL_free(ssl);
    SSL_CTX_free(ctx);
}

В этом примере, контекст SSL ctx инициируется с ролью сервера и функциональным load_cert загружает сертификат сервера в ctx. Сервер затем ожидает клиента, чтобы инициировать квитирование. Однако, поскольку закрытый ключ не загружается в структуру SSL, сервер не может дешифровать предосновной секрет, который клиент отправляет, и сбои квитирования.

Коррекция — загружает закрытый ключ в контекст SSL

Одна возможная коррекция должна загрузить закрытый ключ в контекст SSL после того, как вы загрузите файл сертификата сервера.

#include <stdio.h>
#include <stdlib.h>
#include <openssl/ssl.h>
#define SSL_SERVER_CRT "server.pem"
#define SSL_SERVER_KEY "server.key"

#define fatal_error() exit(-1)

void load_cert(SSL_CTX* ctx, const char* certfile)
{
    int ret = SSL_CTX_use_certificate_file(ctx, certfile, SSL_FILETYPE_PEM);
    if (ret <= 0) fatal_error();

    ret = SSL_CTX_use_PrivateKey_file(ctx, SSL_SERVER_KEY, SSL_FILETYPE_PEM);
    if (ret <= 0) fatal_error();
}

void func()
{
    int ret;
    SSL_CTX* ctx;
    SSL* ssl;

    /* creation context for the SSL protocol */
    ctx = SSL_CTX_new(SSLv23_server_method());
    if (ctx == NULL) fatal_error();

    /* context configuration */
    load_cert(ctx, SSL_SERVER_CRT);

    /* Handle connection */
    ssl = SSL_new(ctx);
    ret = SSL_accept(ssl);
    if (ret <= 0) fatal_error();

    SSL_free(ssl);
    SSL_CTX_free(ctx);
}

Информация о результате

Группа: криптография
Язык: C | C++
Значение по умолчанию: Off
Синтаксис командной строки: CRYPTO_SSL_NO_PRIVATE_KEY
Удар: носитель
ID CWE: 573
Введенный в R2020a