如何从.p12文件获取对应证书私钥并删除过期证书?
处理PKCS#12文件中的过期证书与对应私钥问题
一、确认有效证书对应的私钥
PKCS#12(.p12)文件的规范里,通常一个私钥只会对应一个主证书,additional_certs里的额外证书一般是CA根证书/中间证书,或是不带私钥的关联证书。你可以通过对比私钥公钥与有效证书公钥的一致性,确认拿到的private_key是否对应目标证书:
from cryptography.hazmat.primitives.serialization import pkcs12, Encoding, PublicFormat # 读取p12文件(新版本cryptography无需传入default_backend) p12_file_path = 'my_file.p12' password = 'mypassword'.encode() with open(p12_file_path, 'rb') as p12_file: private_key, expired_cert, additional_certs = pkcs12.load_key_and_certificates( p12_file.read(), password ) # 定位有效证书 valid_cert = additional_certs[1] # 提取私钥的公钥 private_key_pub = private_key.public_key().public_bytes( encoding=Encoding.PEM, format=PublicFormat.SubjectPublicKeyInfo ) # 提取有效证书的公钥 cert_pub = valid_cert.public_key().public_bytes( encoding=Encoding.PEM, format=PublicFormat.SubjectPublicKeyInfo ) # 对比验证 if private_key_pub == cert_pub: print("当前获取的私钥就是有效证书对应的私钥") else: print("私钥与有效证书不匹配,说明该有效证书无对应私钥(额外证书通常不带私钥)")
如果对比一致,private_key就是你要找的有效证书私钥;若不一致,基本可以确定该有效证书本身不附带私钥。
二、删除过期证书,重新生成干净的PKCS#12文件
要移除过期证书,可利用cryptography将需要保留的私钥、有效证书(设为主证书)和必要的额外证书重新打包成新的.p12文件:
from cryptography.hazmat.primitives.serialization import pkcs12, BestAvailableEncryption # 筛选需要保留的额外证书(排除已定位的有效证书,避免重复) retained_additional_certs = [cert for cert in additional_certs if cert != valid_cert] # 生成新的p12文件 with open('cleaned_file.p12', 'wb') as new_p12: new_p12.write( pkcs12.serialize_key_and_certificates( name=b"", # 可自定义证书名称,为空不影响使用 private_key=private_key, certificate=valid_cert, # 将有效证书设为新文件的主证书 additional_certificates=retained_additional_certs, encryption_algorithm=BestAvailableEncryption(password) ) )
生成的新.p12文件将只包含有效证书、对应私钥和你需要保留的其他证书,过期证书已被排除。
内容的提问来源于stack exchange,提问作者LuisFerchx
相关产品推荐
相关产品推荐

