将证书写到DER

时间:2018-09-06 19:15:08

标签: c soap openssl der wsse

我正在尝试将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);
}

这不是。 它返回并malloc分配了正确的字节数,似乎可以正确写出到内存中,但是结果字符串不正确(前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 :(得分:1)

  

它返回并malloc分配正确的字节数,并显示为   正确写出内存,但结果字符串不正确

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);

最后,您的 actual 问题是

  

我需要PEM格式的证书,而没有“ ----- BEGIN PRIVATE   KEY -----“页眉,页脚或换行符。

以DER格式编写证书似乎无法满足您的需求。 This answer to another SO question说明了如何结合使用PEM_read_bio()和功能EVP_EncodeBlock()