C语言 将证书写入 DER



我正在尝试在内存中将 X509 证书写入 DER 格式。 将其写入文件可以完美地工作。

我需要 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;
}

它返回并恶意查找正确的字节数,并显示 正确写出到内存,但生成的字符串不正确

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 格式的证书,而无需"-----开始私有" 键-----"页眉、页脚或换行符。

以 DER 格式编写证书似乎并不能满足您的需求。这个对另一个 SO 问题的回答解释了如何将函数PEM_read_bio()EVP_EncodeBlock()结合使用来实现此目的。

相关内容

  • 没有找到相关文章

最新更新