我试图在内存中编写一个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;
}发布于 2018-09-11 03:50:04
它返回和错误设置正确的字节数,并似乎正确地写入内存,但结果字符串不正确。
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格式编写证书似乎不能满足您的需要。This answer to another SO question解释了如何将函数PEM_read_bio()与EVP_EncodeBlock()结合使用。
https://stackoverflow.com/questions/52210793
复制相似问题