Мне нужно хранить сертификаты и их закрытый ключ в памяти.Сертификаты могут быть в 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
?