如何以编程方式在OpenSSL中加载PKCS#12文件?

在基于OpenSSL的SSL服务器应用程序中,我们如何以编程方式加载PKCS#12文件?

另外,我可以在OpenSSL的同一文件中加载具有证书,密钥和CA的PKCS#12文件吗?

是的,您可以使用OpenSSL在同一文件中加载包含证书,密钥和CA的PKCS#12文件。

  • 使用d2i_PKCS12_fp()d2i_PKCS12_bio()加载PKCS#12文件。
  • (可选)使用PKCS12_verify_mac()来validation密码。
  • 使用PKCS12_parse()解密并提取密钥,证书和CA链。

从openssl-1.0.0d / demos / pkcs12 / pkread.c :

 #include  #include  #include  #include  #include  /* Simple PKCS#12 file reader */ int main(int argc, char **argv) { FILE *fp; EVP_PKEY *pkey; X509 *cert; STACK_OF(X509) *ca = NULL; PKCS12 *p12; int i; if (argc != 4) { fprintf(stderr, "Usage: pkread p12file password opfile\n"); exit (1); } OpenSSL_add_all_algorithms(); ERR_load_crypto_strings(); if (!(fp = fopen(argv[1], "rb"))) { fprintf(stderr, "Error opening file %s\n", argv[1]); 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); } if (!PKCS12_parse(p12, argv[2], &pkey, &cert, &ca)) { fprintf(stderr, "Error parsing PKCS#12 file\n"); ERR_print_errors_fp(stderr); exit (1); } PKCS12_free(p12); if (!(fp = fopen(argv[3], "w"))) { fprintf(stderr, "Error opening file %s\n", argv[1]); exit(1); } if (pkey) { fprintf(fp, "***Private Key***\n"); PEM_write_PrivateKey(fp, pkey, NULL, NULL, 0, NULL, NULL); } if (cert) { fprintf(fp, "***User Certificate***\n"); PEM_write_X509_AUX(fp, cert); } if (ca && sk_X509_num(ca)) { fprintf(fp, "***Other Certificates***\n"); for (i = 0; i < sk_X509_num(ca); i++) PEM_write_X509_AUX(fp, sk_X509_value(ca, i)); } sk_X509_pop_free(ca, X509_free); X509_free(cert); EVP_PKEY_free(pkey); fclose(fp); return 0; } 

尝试使用man SSL ,它会为您提供OpenSSLfunction列表。 像SSL_load_client_CA_file这样的SSL_load_client_CA_file可能适合您的需求; 这取决于证书是在磁盘上的文件中还是已在内存中。 有很多辅助函数,其中一个可以解决问题。 还可以查看man PEM的PEM处理程序。

编辑:嗯,也许是d2i_PKCS12_fpPKCS12_parse的组合(两者都可以从 )让你从文件中读取证书并解析它。

请注意,代码将证书写为可信证书(加密)。 如果需要未加密的证书,请将对PEM_write_X509_AUX()的调用更改为PEM_write_X509()。