Написать сертификат в DER
Я пытаюсь записать X509 Cert в формат DER в памяти. Запись его в файл работает отлично.
Мне нужен сертификат в формате PEM без заголовка, нижнего колонтитула или перевода строки "-----BEGIN PRIVATE KEY-----". Я не могу понять, как сделать это напрямую, так что... Я выводлю в кодировку der и base64.
ЭТО РАБОТАЕТ.
int X509_to_DER_file(X509 *cert) {
int res=0;
out = BIO_new(BIO_s_file());
if (NULL != out) {
if(BIO_write_filename(out, "my.der") > 0) {
res = i2d_X509_bio(out, cert);
}
BIO_free_all(out);
}
return (tres);
}
ЭТО НЕ. Он возвращает и вычисляет неправильное количество байтов и, по-видимому, правильно записывает в память, но получающаяся строка неверна (первые 15 или около того позиций верны).
char *X509_to_DER_mem(X509 *cert) {
char *der = NULL;
bio = BIO_new(BIO_s_mem());
if (NULL != bio) {
//load cert into bio
if (0 == i2d_X509_bio(bio, cert)) {
BIO_flush(bio);
BIO_free(bio);
return NULL;
}
der = (char *) malloc(bio->num_write + 1);
if (NULL == der) {
BIO_free(bio);
return NULL;
}
memset(der, 0, bio->num_write + 1);
BIO_read(bio, der, bio->num_write);
// Appears to work put "der" is incomplete.
BIO_free(bio);
}
return der;
}
1 ответ
Он возвращает и выделяет правильное количество байтов и, по-видимому, правильно записывает в память, но получающаяся строка неверна
Результат i2d_X509_bio()
не строка с нулевым символом в конце, а набор байтов. Если вы попытаетесь записать его в файл в виде строки, он может выглядеть неполным, потому что вы можете встретить 0-байт в некотором месте до того, как достигнете конца. Так что в дополнение к char *
результат, ваша функция X509_to_DER_mem()
придется возвращать количество байтов, составляющих результат.
Что касается памяти BIO
Другой способ получения данных BIO_get_mem_data()
функция. Что-то вроде этого:
char *ptr = NULL;
long len = BIO_get_mem_data(bio, &ptr);
der = malloc(len);
memcpy(der, ptr, len);
Наконец, ваш актуальный вопрос
Мне нужен сертификат в формате PEM без заголовка, нижнего колонтитула или перевода строки "-----BEGIN PRIVATE KEY-----".
Написание сертификата в формате DER, кажется, не дает вам то, что вам нужно. Этот ответ на другой вопрос SO объясняет, как вы могли бы использовать функцию PEM_read_bio()
в комбинации с EVP_EncodeBlock()
для этой цели.