Python从.pfx证书提取公钥:解决p12对象无get_publickey()方法问题
从PFX证书中同时提取私钥和公钥的方法
嘿,我明白你的困扰了!你说得没错,OpenSSL.crypto.PKCS12对象确实没有直接的get_publickey()方法,但我们可以通过先提取证书,再从证书中获取公钥的方式来解决这个问题。PFX(PKCS#12)文件其实包含了私钥和对应的证书链,公钥就存储在证书里。
下面是修改后的完整代码,既能导出私钥到PEM文件,也能提取并保存公钥:
import contextlib import OpenSSL.crypto import os import requests import ssl import tempfile pfx_password = 'thiscertpassword' tpem_private = 'temp_private.pem' tpem_public = 'temp_public.pem' pfxfile = 'fts.pfx' # 加载PFX文件 with open(pfxfile, 'rb') as f: pfx = f.read() p12 = OpenSSL.crypto.load_pkcs12(pfx, pfx_password) # 导出私钥到PEM文件 with open(tpem_private, 'wb') as f_pem: private_key = p12.get_privatekey() f_pem.write(OpenSSL.crypto.dump_privatekey(OpenSSL.crypto.FILETYPE_PEM, private_key)) # 提取证书并导出公钥到PEM文件 certificate = p12.get_certificate() public_key = certificate.get_pubkey() with open(tpem_public, 'wb') as f_pub: f_pub.write(OpenSSL.crypto.dump_publickey(OpenSSL.crypto.FILETYPE_PEM, public_key))
关键步骤解释:
p12.get_certificate():从PKCS12对象中取出包含公钥的证书对象certificate.get_pubkey():从证书对象中提取公钥OpenSSL.crypto.dump_publickey():将公钥以PEM格式导出,参数和导出私钥一致,指定FILETYPE_PEM即可
这样你就能同时得到私钥和公钥的PEM文件啦!
内容的提问来源于stack exchange,提问作者Mark Ginsburg




