C 提取客户端证书&;来自.p12文件的私钥

C 提取客户端证书&;来自.p12文件的私钥,c,openssl,ssl-certificate,pkcs#12,C,Openssl,Ssl Certificate,Pkcs#12,有人能告诉我怎么用吗 PKCS12 *d2i_PKCS12_fp(FILE *fp, PKCS12 **p12); int PKCS12_parse(PKCS12 *p12, const char *pass, EVP_PKEY **pkey, X509 **cert, STACK_OF(X509) **ca); 任何文档引用也可以使用。无需错误检查: FILE *p12_file; PKCS12 *p12_cert = NULL; EVP_PKEY *pkey; X509 *x509_

有人能告诉我怎么用吗

PKCS12 *d2i_PKCS12_fp(FILE *fp, PKCS12 **p12); 

int PKCS12_parse(PKCS12 *p12, const char *pass, EVP_PKEY **pkey, X509 **cert, STACK_OF(X509) **ca); 

任何文档引用也可以使用。

无需错误检查:

FILE *p12_file;
PKCS12 *p12_cert = NULL;
EVP_PKEY *pkey;
X509 *x509_cert;
STACK_OF(X509) *additional_certs = NULL;

p12_file = fopen("foo.p12", "rb");
d2i_PKCS12_fp(p12_file, &p12_cert);
fclose(p12_file);

PKCS12_parse(p12_cert, "password", &pkey, &x509_cert, &additional_certs);
私钥现在位于
pkey
中,证书位于
x509\u-cert
中,任何其他证书位于
其他\u-certs

  • 以下是openssl的解析页面:
  • 以下是苹果使用openssl libs的链接:
以下是苹果网站的描述:

int PKCS12_parse(PKCS12 *p12, char *pass, EVP_PKEY **pkey, X509 **cert,
                             STACK **ca);
此函数采用PKCS12结构和密码(ASCII,以null结尾) 并返回私钥、相应的证书和任何CA 证书。如果其中任何一项不是必需的,则可以将其作为NULL传递。 “ca”参数应为NULL、指向NULL的指针或有效堆栈 结构。通常,要读取PKCS#12文件,您可以执行以下操作:

p12 = d2i_PKCS12_fp(fp, NULL);
PKCS12_parse(p12, password, &pkey, &cert, NULL);    /* CAs not wanted */
PKCS12_free(p12);

当我使用上述代码时,当d2i_PKCS12_fp(p12_文件和p12_证书)时,它会崩溃;正在被处决。有人能告诉我为什么会发生这种情况吗?@bharat:对不起,
p12\u cert
也需要初始化为
NULL
(请参阅更新的答案)。@caf:我想它是在第行初始化为NULL的#02@bharat:现在是,因为我修复了它-但以前不是,这就是错误所在。@bharat:对我来说很好。。。(如果您愿意,也可以只执行
p12\u cert=d2i\u PKCS12\u fp(p12\u文件,NULL);
)。此i2d函数的SSLeay站点及其说明也很有帮助: