Написать сертификат в 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() для этой цели.

Другие вопросы по тегам