c - 如何使用 openssl 加载 pkcs12 并将其转换为 char* ?

标签 c openssl pkcs#12

我想使用 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_push将BIO链接在一起。请参阅 BIO_push(3) 上的手册页.

关于c - 如何使用 openssl 加载 pkcs12 并将其转换为 char* ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30162783/

相关文章:

c - 结构体数组的单行初始化

c - 产生错误的 sqlite 日志查询

c - 如何从 C 中的控制台读取一行?

用于 SSL 证书验证的 PHP 程序

c++ - 使用 openssl 及其未阻塞的 bio,ssl_read 返回 SSL_ERROR_SYSCALL 和 SSL_ERROR_WANT_READ

c - 程序终止而不打印

windows - 无法使用 pkcs12 文件连接到 RabbitMq Broker

javascript - 如何在 Javascript 中获取 X509Certificate 指纹?

android - 无需密码即可将 jks keystore 转换为 p12

flash - 如何找出在 openssl 中制作的 .p12 文档的密码?