Храните закрытый ключ и сертификат в C ++ / OpenSSL - PullRequest
0 голосов
/ 31 мая 2018

Мне нужно хранить сертификаты и их закрытый ключ в памяти.Сертификаты могут быть в 4 следующих форматах: PEM, PKCS12, PKCS7, DER.Мне нужно будет записать их обратно как PEM позже.

Все фрагменты, которые я вижу, хранят только открытый сертификат в структуре X509.Как насчет приватной части ??

Я нашел способ использования X509_INFO, но у меня возникла серьезная проблема: я не нашел способа получить X509_INFO от DER / PKCS7Файлы / PKCS12

На данный момент я получил следующий код:

    QList<X509_INFO*>* Certificat::stringPEMToX509_INFO(QString stringPem)
{
    QList <X509_INFO*>* liste_certificats = new QList<X509_INFO*>;
    STACK_OF(X509_INFO)* pile_certificats = NULL;
    X509_INFO* certificat;

    BIO* bio = BIO_new(BIO_s_mem());

    const char* pem = stringPem.toAscii().constData();
    BIO_puts(bio, pem);

    //https://github.com/openssl/openssl/blob/master/crypto/pem/pem_info.c
    pile_certificats = PEM_X509_INFO_read_bio(bio, NULL, NULL, NULL);

    for (int i = 0; i < sk_X509_INFO_num(pile_certificats); i++)
    {
        certificat = sk_X509_INFO_value(pile_certificats, i);
        liste_certificats->push_back(certificat);
    }
    sk_X509_INFO_pop_free(pile_certificats, X509_INFO_free);
    BIO_free_all(bio);

    return liste_certificats;

}

Моя цель - иметь ту же функцию, но для DER, PKCS12 и PKCS7.

Я попытался получить X509_INFO из DER следующим образом:

p12 = d2i_PKCS12_bio(bio, NULL);
certificat = X509_INFO_new();
certificat->x509 = cert;
certificat->x_pkey = pkey;

Но x_pkey - это X509_PKEY, а pkey - EVP_PKEY ...

Если нет возможности сохранитьэто как единая структура, возможно ли будет хранить мои сертификаты как X509 + a EVP_PKEY для закрытого ключа и при этом выводить как приватную, так и открытую часть в PEM?

1 Ответ

0 голосов
/ 02 июня 2018

PKCS7 предназначен только для открытых ключей.DER и PEM - это просто способы кодирования объектов PKCS (и многих других).Поскольку вы хотите хранить все в одной структуре, вы, вероятно, больше всего выиграете от PKCS12. OpenSSL предоставляет функции для анализа данных PKCS12 и извлечения как сертификата, так и ключа.

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