Написать сертификат в DER - PullRequest
       81

Написать сертификат в DER

0 голосов
/ 06 сентября 2018

Я пытаюсь записать сертификат X509 в формат 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 Ответ

0 голосов
/ 11 сентября 2018

Возвращает и возвращает неправильное количество байтов и отображает правильно записать в память, но полученная строка неверна

Результатом 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().

...