P12导出证书证书、私钥
一、简言
今天与客户做微信支付开发支持,然后给到了相应的商户号、apikey、公众号、p12证书等等。但是客户那边不要P12证书,非要pem证书。所以这边要进行P12证书导出公钥、私钥操作。
p12证书全称是PKCS#12(Public-Key Cryptography Standards:公钥加密标准,PKCS#12是一种交换数字证书的加密标准,用来描述个人身份信息。如:用户公钥、私钥、证书等。
微信的p12证书里包含了公钥、私钥、证书、序列号。提取这些信息的时候需要输入密码,这个`密码默认是商户号`(这个是重点,这边由于证书时间长,已经不记得密码,查了文档才知道密码默认是商户号)。
二、Linxu具体操作
#1.查看所有信息
[root@test01 ~]# openssl pkcs12 -info -in apiclient_cert_shanxi_app.p12 -nodes
Enter Import Password:
MAC Iteration 1
MAC verified OK #表示密码是正确的
#2.导出证书
[root@test01 ~]# openssl pkcs12 -in apiclient_cert_shanxi_app.p12 -out cert.pem -nokeys
Enter Import Password:
MAC verified OK
#3.导出秘钥
[root@test01 ~]# openssl pkcs12 -in apiclient_cert_shanxi_app.p12 -out private_key.pem -nodes -nocerts
Enter Import Password:
MAC verified OK
#4.查看是否生成证书和密钥
[root@test01 ~]# ll
total 44
-rw-r--r-- 1 root root 2718 Jun 18 2021 apiclient_cert_shanxi_app.p12
-rw-r--r-- 1 root root 1923 Jul 15 15:31 cert.pem
-rw-r--r-- 1 root root 1865 Jul 15 15:32 private_key.pem
#5.查看证书序列号
[root@test01 ~]# openssl x509 -in cert.pem -noout -serial
至此操作结束,把相应的证书和密钥发给开发就好啦。
三、Python具体操作
# !/usr/bin/env python3
# -*- coding:utf-8 -*-
"""
@Version: 3.9
@Author: Jin Hui
@File: p12.py
@Time: 2022-07-15 12:55
"""
from OpenSSL import crypto
# open it, using password. Supply/read your own from stdin.
p12 = crypto.load_pkcs12(open('C:/Users/97408/Desktop/apiclient_cert_shanxi_app.p12', "rb").read(),
'*********'.encode('ascii'))
cer = p12.get_certificate() # (signed) certificate object
pkey = p12.get_privatekey() # private key.
ca_cer = p12.get_ca_certificates() # ca chain.
print(cer, pkey, ca_cer)
print('版本', cer.get_version())
print('签名算法', cer.get_signature_algorithm())
print('序列号:', cer.get_serial_number())
print('证书是否过时:', cer.has_expired())
print('在此以前无效:', cer.get_notBefore())
print('在此以后无效', cer.get_notAfter())
# 主题名称
subject = cer.get_subject()
s_components = subject.get_components()
print(s_components)
key_dict = {'UID': '用户 ID',
'CN': '经常使用名称',
'OU': '组织单位',
'O': '组织',
'C': '国家或地区'
}
for (key, value) in s_components:
print(key, value)
print(key_dict.get(key.decode(), key))
# 签发者名称
suer = cer.get_issuer()
print(suer.get_components())
# 证书扩展信息
print('扩展数:', cer.get_extension_count())
print('扩展1:', cer.get_extension(0))
# PEM formatted private key
private_key = crypto.dump_privatekey(crypto.FILETYPE_PEM, p12.get_privatekey())
with open("private_key.pem", mode='wb') as f1:
f1.write(private_key)
# PEM formatted certificate
certificate = crypto.dump_certificate(crypto.FILETYPE_PEM, p12.get_certificate())
with open("cert.pem", mode='wb') as f2:
f2.write(certificate)
运行完成后看到多出两个文件证书和密钥。