如何使用 openssl 加载 pkcs12 并将其转换为 char*?
How to load pkcs12 and convert it to char* with openssl?
我想使用 openssl 加载 pkcs12 并将其编码为 base64。我不需要解析它只是为了加载它然后将它编码为 base64,所以当我解码它并将内容放入文件时我将再次拥有 pkcs12 结构。
char* loadPkcs12(const char* path) {
FILE *fp;
PKCS12 *p12;
OpenSSL_add_all_algorithms();
ERR_load_crypto_strings();
if (!(fp = fopen(path, "rb"))) {
fprintf(stderr, "Error opening file %s\n", path);
exit(1);
}
p12 = d2i_PKCS12_fp(fp, NULL);
fclose(fp);
if (!p12) {
fprintf(stderr, "Error reading PKCS#12 file\n");
ERR_print_errors_fp(stderr);
exit(1);
}
//here I am trying to encode it
BIO* bio;
bio = BIO_new(BIO_s_mem());
i2d_PKCS12_bio(bio, p12);
BUF_MEM *bufferPtr;
BIO_get_mem_ptr(bio, &bufferPtr);
printf(toBase64(bufferPtr->data));
PKCS12_free(p12);
return 0;
}
char* toBase64(char* str) {
BIO *bio, *b64;
BUF_MEM *bufferPtr;
b64 = BIO_new(BIO_f_base64());
bio = BIO_new(BIO_s_mem());
bio = BIO_push(b64, bio);
BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL); //Ignore newlines - write everything in one line
BIO_write(bio, str, strlen(str));
BIO_flush(bio);
BIO_get_mem_ptr(bio, &bufferPtr);
BIO_set_close(bio, BIO_NOCLOSE);
BIO_free_all(bio);
char* output;
output = (*bufferPtr).data;
return output;
}
我知道 Base64 的编码工作正常,将 PKCS12 转换为 char* 时出现问题。我的输出现在只有大约 60 个字符长,应该更长。有没有办法将 PKCS12 转换为 char* 缓冲区?
非常感谢您的建议。
My output is right now only about 60 chars long and it should be much more longer. Is there a way how to convert PKCS12 to char* buffer?
我相信 toBase64
需要一个指针和一个长度以防有任何嵌入的 NULL:
BUF_MEM *bufferPtr = NULL;
BIO_get_mem_ptr(bio, &bufferPtr);
if(bufferPtr != NULL) {
if(bufferPtr->data && bufferPtr->length > 0)
printf(toBase64(bufferPtr->data, bufferPtr->length));
}
并且:
char* toBase64(char* str, int length) {
...
}
理想情况下,您可以使用 unsigned char*
而不是 char*
作为指针;和 size_t
而不是 int
的长度。但是那艘船已经起航了
此外,请确保 Base64 字符串上有 NULL 终止符。我不记得它是否自动添加。
相关的,可以将BIO链接在一起BIO_push
。请参阅 BIO_push(3)
.
上的手册页
我想使用 openssl 加载 pkcs12 并将其编码为 base64。我不需要解析它只是为了加载它然后将它编码为 base64,所以当我解码它并将内容放入文件时我将再次拥有 pkcs12 结构。
char* loadPkcs12(const char* path) {
FILE *fp;
PKCS12 *p12;
OpenSSL_add_all_algorithms();
ERR_load_crypto_strings();
if (!(fp = fopen(path, "rb"))) {
fprintf(stderr, "Error opening file %s\n", path);
exit(1);
}
p12 = d2i_PKCS12_fp(fp, NULL);
fclose(fp);
if (!p12) {
fprintf(stderr, "Error reading PKCS#12 file\n");
ERR_print_errors_fp(stderr);
exit(1);
}
//here I am trying to encode it
BIO* bio;
bio = BIO_new(BIO_s_mem());
i2d_PKCS12_bio(bio, p12);
BUF_MEM *bufferPtr;
BIO_get_mem_ptr(bio, &bufferPtr);
printf(toBase64(bufferPtr->data));
PKCS12_free(p12);
return 0;
}
char* toBase64(char* str) {
BIO *bio, *b64;
BUF_MEM *bufferPtr;
b64 = BIO_new(BIO_f_base64());
bio = BIO_new(BIO_s_mem());
bio = BIO_push(b64, bio);
BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL); //Ignore newlines - write everything in one line
BIO_write(bio, str, strlen(str));
BIO_flush(bio);
BIO_get_mem_ptr(bio, &bufferPtr);
BIO_set_close(bio, BIO_NOCLOSE);
BIO_free_all(bio);
char* output;
output = (*bufferPtr).data;
return output;
}
我知道 Base64 的编码工作正常,将 PKCS12 转换为 char* 时出现问题。我的输出现在只有大约 60 个字符长,应该更长。有没有办法将 PKCS12 转换为 char* 缓冲区? 非常感谢您的建议。
My output is right now only about 60 chars long and it should be much more longer. Is there a way how to convert PKCS12 to char* buffer?
我相信 toBase64
需要一个指针和一个长度以防有任何嵌入的 NULL:
BUF_MEM *bufferPtr = NULL;
BIO_get_mem_ptr(bio, &bufferPtr);
if(bufferPtr != NULL) {
if(bufferPtr->data && bufferPtr->length > 0)
printf(toBase64(bufferPtr->data, bufferPtr->length));
}
并且:
char* toBase64(char* str, int length) {
...
}
理想情况下,您可以使用 unsigned char*
而不是 char*
作为指针;和 size_t
而不是 int
的长度。但是那艘船已经起航了
此外,请确保 Base64 字符串上有 NULL 终止符。我不记得它是否自动添加。
相关的,可以将BIO链接在一起BIO_push
。请参阅 BIO_push(3)
.