from enum import Enum
from cryptography import x509
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
class CertificateCode(Enum):
der,pem='der', 'pem'
def der_to_pem(der_filename,filepath):
# 读取DER编码的证书
with open(der_filename, "rb") as der_file:
der_data = der_file.read()
# 加载证书
cert = x509.load_der_x509_certificate(der_data, default_backend())
# 将证书转换为PEM格式
pem_data = cert.public_bytes(encoding=serialization.Encoding.PEM)
# 将PEM数据写入文件
pem_filename=filepath+'/certificate.pem'
with open(pem_filename, "wb") as pem_file:
pem_file.write(pem_data)
return pem_filename
def pem_to_der(pem_filename,filepath):
# 读取PEM格式的证书
with open(pem_filename, "rb") as pem_file:
pem_data = pem_file.read()
# 加载证书
cert = x509.load_pem_x509_certificate(pem_data, default_backend())
# 将证书转换为DER格式
der_data = cert.public_bytes(encoding=serialization.Encoding.DER)
der_filename=filepath+'/certificate.der'
# 将DER数据写入文件
with open(der_filename, "wb") as der_file:
der_file.write(der_data)
return der_filename
def parse_certificate(cert_filename,certificate_code=CertificateCode.der):
# 读取证书文件
with open(cert_filename, "rb") as cert_file:
cert_data = cert_file.read()
if certificate_code==CertificateCode.der:
cert = x509.load_der_x509_certificate(cert_data, default_backend())
# 加载证书
else:
cert = x509.load_pem_x509_certificate(cert_data, default_backend())
certificate_dic={}
# 解析证书信息
subject = cert.subject
certificate_dic["subject"]=subject
issuer = cert.issuer
certificate_dic["issuer"] = issuer
version = cert.version
certificate_dic["version"] = version
serial_number = cert.serial_number
certificate_dic["serial_number"] = serial_number
#not_valid_before = cert.not_valid_before
#certificate_dic["not_valid_before"] = not_valid_before
not_valid_before_utc = cert.not_valid_before_utc
certificate_dic["not_valid_before_utc"] = not_valid_before_utc
#not_valid_after = cert.not_valid_after
#certificate_dic["not_valid_after"] = not_valid_after
not_valid_after_utc=cert.not_valid_after_utc
certificate_dic["not_valid_after_utc"] = not_valid_after_utc
public_key = cert.public_key().public_numbers()
certificate_dic["public_key"] = public_key
public_key_algorithm_oid = cert.public_key_algorithm_oid
certificate_dic["public_key_algorithm_oid"] = public_key_algorithm_oid
signature = cert.signature.hex().upper()
certificate_dic["signature"] = signature
signature_hash_algorithm=cert.signature_hash_algorithm
certificate_dic["signature_hash_algorithm"] = signature_hash_algorithm
signature_algorithm_oid=cert.signature_algorithm_oid
certificate_dic["signature_algorithm_oid"] = signature_algorithm_oid
signature_algorithm_parameters=cert.signature_algorithm_parameters
certificate_dic["signature_algorithm_parameters"] = signature_algorithm_parameters
certificate_dic["signature_algorithm_parameters_name"] = signature_algorithm_parameters.name
#certificate_dic["signature_algorithm_parameters_AUTO"] = signature_algorithm_parameters.AUTO
#certificate_dic["signature_algorithm_parameters_DIGEST_LENGTH"] = signature_algorithm_parameters.DIGEST_LENGTH
#certificate_dic["signature_algorithm_parameters_MAX_LENGTH"] = signature_algorithm_parameters.MAX_LENGTH
# 如果证书包含扩展,可以进一步解析
extensions = cert.extensions
if extensions:
for ext in extensions:
certificate_dic[f"{ext.oid}"]=ext.value
return certificate_dic
def read_certificate(filename,certificate_code=CertificateCode.pem):
if certificate_code==CertificateCode.pem:
with open(filename, 'r', encoding='utf-8') as cert_file:
# 读取文件的全部内容
content = cert_file.read()
else:
with open(filename, 'rb') as cert_file:
# 读取文件的全部内容
content = cert_file.read()
return str(content)
def main():
pem_filename="../../../commercial_cryptogram/resources/scctc.org.cn.crt"
filepath_der='../../../commercial_cryptogram/resources/der'
der_filename=pem_to_der(pem_filename,filepath_der)
print(f'der_filename={der_filename}')
pem_filename=der_to_pem(der_filename,filepath_der)
print(f'pem_filename={pem_filename}')
cert_dic=parse_certificate(der_filename,certificate_code=CertificateCode.der)
print('Certificate:')
for name,value in cert_dic.items() :
print(f'{name}:{value}')
if __name__ == '__main__':
main()
python对数字证书的解析
最新推荐文章于 2025-03-09 22:43:36 发布
Python3.9
Conda
Python
Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本
您可能感兴趣的与本文相关的镜像
Python3.9
Conda
Python
Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本
2645

被折叠的 条评论
为什么被折叠?



