OpenSSL与证书(三)PKCS#12证书

本篇是本系列的最后一篇:

OpenSSL与证书(一)公私钥-CSDN博客

OpenSSL与证书(二)证书-CSDN博客

OpenSSL与证书(三)PKCS#12证书-CSDN博客 

用途

PKCS #12证书用于存放个人证书/私钥,一般以.p12或pfx做后缀。

更多信息可查看 https://en.wikipedia.org/wiki/PKCS_12

The full PKCS #12 standard is very complex. But in practice it is normally used to store just one private key and its associated certificate chain.

生成PKCS#12证书

生成包含证书和私钥的PKCS#12证书

执行如下指令,将PEM格式的证书和私钥转pkcs12证书:

openssl pkcs12 -export -inkey server.key -in server.pem -out server.p12

根据提示设置密码

Enter Export Password:
Verifying - Enter Export Password:

不设置密码也可以生成,似乎提取时会遇到问题。 

 生成包含证书、私钥和CA证书的PKCS#12证书

执行如下指令,将PEM格式的证书、私钥和CA证书转pkcs12证书

openssl pkcs12 -export -inkey server.key -in server.pem -chain -CAfile ca.pem -out server.p12

【Note】 只支持PEM格式的证书打包到pkcs12证书中,如果时DER格式的证书,需要先转换格式

从PKCS#12证书中提取内容

提取私钥

执行如下指令,

openssl pkcs12 -in server.p12 -nocerts -out server-p12.key

根据提示输入证书提出密码,并设置私钥的加密密码

Enter Import Password:
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:

可用如下指令,不设置私钥的密码

openssl pkcs12 -in server.p12 -nocerts -out server-p12.key -nodes

 提取证书

执行如下指令从PKCS#12证书文件中提取X.509证书

openssl pkcs12 -in server.p12 -nokeys -clcerts -out server-p12.pem

提取CA证书

执行如下指令从PKCS#12证书文件中提取PEM格式的CA证书

openssl pkcs12 -in server.p12 -nokeys -cacerts -out ca-p12.pem

提取证书+CA证书

提取CA证书和业务证书

openssl pkcs12 -in server.p12 -nokeys -out p12.pem

提取所有内容

提取私钥、证书、CA证书,并写入到文件中

openssl pkcs12 -in server.p12 -nodes -out all-in-one-p12.pem

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用 OpenSSL 库中的 PKCS12_parse 函数来解析 PKCS#12 格式的证书,然后使用 X509_verify_cert 函数来验证证书链。以下是一个简单的示例代码: ```c #include <openssl/pkcs12.h> #include <openssl/x509_vfy.h> int verify_pkcs12(const char *pkcs12_file, const char *password) { PKCS12 *p12 = NULL; EVP_PKEY *pkey = NULL; X509 *cert = NULL; STACK_OF(X509) *ca = NULL; X509_STORE *store = NULL; X509_STORE_CTX *ctx = NULL; int ret = -1; /* Load PKCS#12 file */ FILE *fp = fopen(pkcs12_file, "rb"); if (!fp) { perror("fopen"); goto end; } p12 = d2i_PKCS12_fp(fp, NULL); fclose(fp); if (!p12) { printf("Error loading PKCS#12 file\n"); ERR_print_errors_fp(stderr); goto end; } /* Extract certificate and private key */ if (!PKCS12_parse(p12, password, &pkey, &cert, &ca)) { printf("Error extracting certificate and private key\n"); ERR_print_errors_fp(stderr); goto end; } /* Verify certificate chain */ store = X509_STORE_new(); if (!store) { printf("Error creating X509 store\n"); ERR_print_errors_fp(stderr); goto end; } for (int i = 0; i < sk_X509_num(ca); i++) { X509_STORE_add_cert(store, sk_X509_value(ca, i)); } X509_STORE_set_flags(store, X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL); ctx = X509_STORE_CTX_new(); if (!ctx) { printf("Error creating X509 store context\n"); ERR_print_errors_fp(stderr); goto end; } if (X509_STORE_CTX_init(ctx, store, cert, ca) != 1) { printf("Error initializing X509 store context\n"); ERR_print_errors_fp(stderr); goto end; } if (X509_verify_cert(ctx) != 1) { printf("Error verifying certificate chain\n"); ERR_print_errors_fp(stderr); goto end; } /* Verification succeeded */ ret = 0; end: if (p12) PKCS12_free(p12); if (pkey) EVP_PKEY_free(pkey); if (cert) X509_free(cert); if (ca) sk_X509_pop_free(ca, X509_free); if (ctx) X509_STORE_CTX_free(ctx); if (store) X509_STORE_free(store); return ret; } ``` 该函数将返回 0 表示验证成功,-1 表示验证失败。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值