第一章 P12类型证书导出证书、私钥

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)
运行完成后看到多出两个文件证书和密钥。

image

posted @ 2022-07-15 16:39  年少纵马且长歌  阅读(5799)  评论(0编辑  收藏  举报