【问题标题】:Write Cert to DER将证书写入 DER
【发布时间】:2019-02-12 02:44:12
【问题描述】:

我正在尝试将 X509 证书写入内存中的 DER 格式。 将其写入文件非常有效。

我需要没有“-----BEGIN PRIVATE KEY-----”页眉、页脚或换行符的 PEM 格式的证书。我无法弄清楚如何直接做到这一点...... 我正在输出到 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;
}

【问题讨论】:

  • 查看BIO_read的返回值
  • 顺便说一句,我不认为你应该直接使用 BIO 的内部字段。它应该是一个不透明的类型。
  • bio 是某种全球性的吗?

标签: c soap openssl der wsse


【解决方案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);

最后,你的实际问题是

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

以 DER 格式编写证书似乎无法满足您的需求。 This answer to another SO question 解释了如何将函数 PEM_read_bio()EVP_EncodeBlock() 结合使用。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-06
  • 1970-01-01
  • 2014-02-24
  • 2016-12-06
  • 2022-06-23
  • 1970-01-01
相关资源
最近更新 更多