Библиотека C ++ и OpenSSL: как я могу установить subjectAltName (SAN) из кода? - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь создать самозаверяющий запрос с subjectAltName из кода C ++ (пытаюсь реализовать динамические самозаверяющие сертификаты, такие как this , для актуальной версии OpenResty, но для subjectAltName нет решения).

Пожалуйста, приведите несколько примеров настройки SAN из кода C ++ / OpenSSL. Я пытаюсь примерно так:

    X509_EXTENSION  *ext;
    STACK_OF (X509_EXTENSION) * extlist;
    char *ext_name = "subjectAltName";
    char *ext_value = "DNS:lohsport.com";

    extlist = sk_X509_EXTENSION_new_null ();
    ext = X509V3_EXT_conf (NULL, NULL, ext_name, ext_value);
    if(ext == NULL)
    {
        *err = "Error creating subjectAltName extension";
        goto failed;
    }
    sk_X509_EXTENSION_push (extlist, ext);

    if (!X509_REQ_add_extensions (x509_req, extlist)){
        *err = "Error adding subjectAltName to the request";
        goto failed;
    }
    sk_X509_EXTENSION_pop_free (extlist, X509_EXTENSION_free);

Он успешно компилируется, но не работает. Буду благодарен за любую помощь.

UPDATE Теперь я пытаюсь работать как в selfsing.c демо библиотеки OpenSSL:

1) Я определил функцию для добавления расширений в CSR:

int add_ext(STACK_OF(X509_EXTENSION) *sk, int nid, char *value)
{
X509_EXTENSION *ex;
ex = X509V3_EXT_conf_nid(NULL, NULL, nid, value);
if (!ex)
    return 0;
sk_X509_EXTENSION_push(sk, ex);

return 1;
}

2) Добавить этот блок в мою функцию, которая генерирует CSR:

   char Buffer[512];
    // Format the value
    sprintf (Buffer, "DNS:%s", info->common_name);
    xts = sk_X509_EXTENSION_new_null();
    add_ext(exts, NID_subject_alt_name, Buffer);

    if(X509_REQ_add_extensions(x509_req, exts) != 1) {
        *err = "X509_REQ_add_extensions() failed";
        goto failed;
    }
    sk_X509_EXTENSION_pop_free(exts, X509_EXTENSION_free);

Код снова компилируется правильно, сертификаты генерируются на лету, но альтернативные имена по-прежнему не работают, и я получаю сообщение об ошибке в браузере:

NET :: ERR_CERT_COMMON_NAME_INVALID

и я не вижу информацию об альтернативном имени в деталях сертификата.

Какие еще могут быть решения для проблемы SAN? Я могу предоставить весь код, например, на githab, если он может помочь.

1 Ответ

0 голосов
/ 25 января 2019

Вместо функции X509V3_EXT_conf попробуйте использовать функцию X509V3_EXT_conf_nid, в которой вместо имени передается NID.

ext = X509V3_EXT_conf (NULL, NULL, ext_name, ext_value);

может быть

ext = X509V3_EXT_conf_nid(NULL, NULL, NID_subject_alt_name, ext_value);

Возможно, ваш код не работает, потому что вы не совсем совпадаете с именем расширения с именем в коде OpenSSL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...