Сертификат OpenSSL X509 для строки

Я использую следующий код (упрощенный бит), чтобы получить строку сертификата из структуры X509. В основном функция PEM_write_bio_X509.

X509 *certificate...
....
BIO *bio = BIO_new(BIO_s_mem()), BIO_vfree);
if (!bio || !PEM_write_bio_X509(bio, certificate)) {
    // error handling
}
size_t keylen = BIO_pending(bio);
unique_ptr<char[]> key(new char[keylen]);
int len = BIO_read(bio, key.get(), (int)keylen);
if (len <= 0) {
    // error handling
}
string result = string(key.get(), len);

Результат - это что-то вроде

-----BEGIN CERTIFICATE-----
MIIFLTCCAxUCCQDrAnFYOmsVkzANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJB
VTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0
-----END CERTIFICATE-----

Есть ли какой-либо способ (без его преобразования вручную позже), чтобы получить его непосредственно из OpenSSL в виде одной строки без строк заголовка? Что-то вроде:

MIIFLTCCAxUCCQDrAnFYOmsVkzANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0

header,openssl,certificate,newline,x509,

1

Ответов: 1


1 принят

Есть две функции OpenSSL, которые могут помочь вам достичь этого.

PEM_read_bio () может читать ваш файл сертификата в формате PEM (или любой файл в формате PEM, если на то пошло), и разбивать его на заголовок и данные.

Вас впоследствии интересует содержимое, полученное в dataуказателе, закодированное как base64 в длинной строке. EVP_EncodeBlock () может дать вам это, предоставив это содержимое в качестве второго параметра.

Грубая схема вашего кода:

ret = PEM_read_bio(bio, &name, &header, &data, &len);
if (!ret) {
    // error
}

// Make sure b64block is allocated to contain at least
//     4*ceil(len/3) + 1 bytes
blockLen = EVP_EncodeBlock(b64block, data, len);
// b64block now contains the desired base64 in blockLen relevant bytes,
//     plus a null-character

// Don't forget to OPENSSL_free the name, header and data pointers
заголовок, OpenSSL, сертификат, символ новой строки, x509,
Похожие вопросы