python对数字证书的解析

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

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()

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值