完整的 PKI 证书开发代码示例

Python3.8

Python3.8

Conda
Python

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

以下是一个使用 Python 的cryptography库实现的较为完整的 PKI 证书开发代码示例,涵盖了生成密钥对、创建自签名证书以及对证书进行简单验证的功能,代码是可运行的示例,你可以根据实际需求进一步拓展和完善它。

1. 生成密钥对代码

收起

python

from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization


def generate_key_pair():
    """
    生成RSA密钥对,并将私钥和公钥保存为PEM格式的文件
    """
    # 生成私钥
    private_key = rsa.generate_private_key(
        public_exponent=65537,
        key_size=2048,
        backend=default_backend()
    )

    # 将私钥序列化并保存到文件
    with open('private_key.pem', 'wb') as f:
        f.write(private_key.private_bytes(
            encoding=serialization.Encoding.PEM,
            format=serialization.Format.PrivateKey,
            encryption_algorithm=serialization.NoEncryption()
        ))

    # 从私钥中获取公钥
    public_key = private_key.public_key()

    # 将公钥序列化并保存到文件
    with open('public_key.pem', 'wb') as f:
        f.write(public_key.public_bytes(
            encoding=serialization.Encoding.PEM,
            format=serialization.Format.SubjectPublicKeyInfo
        ))

    print("密钥对生成成功,已保存到相应文件。")

2. 创建自签名证书代码

收起

python

from cryptography import x509
from cryptography.x509.oid import NameOID
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.backends import default_backend
from datetime import datetime, timedelta
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization


def create_self_signed_certificate():
    """
    使用之前生成的私钥创建自签名证书,并保存为PEM格式文件
    """
    # 加载之前生成的私钥
    with open('private_key.pem', 'rb') as key_file:
        private_key = serialization.load_pem_private_key(
            key_file.read(),
            password=None,
            backend=default_backend()
        )

    # 构建证书的主体信息(这里简单示例,可以根据实际详细填写)
    subject = x509.Name([
        x509.NameAttribute(NameOID.COUNTRY_NAME, "CN"),
        x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, "Province"),
        x509.NameAttribute(NameOID.LOCALITY_NAME, "City"),
        x509.NameAttribute(NameOID.ORGANIZATION_NAME, "Company"),
        x509.NameAttribute(NameOID.COMMON_NAME, "example.com")
    ])

    # 构建证书的颁发者信息,这里自签名所以和主体相同
    issuer = subject

    # 设置证书有效期,例如从现在开始1年有效
    valid_from = datetime.utcnow()
    valid_until = valid_from + timedelta(days=365)

    # 构建证书的序列号(简单示例,实际可更复杂)
    serial_number = x509.random_serial_number()

    # 创建证书构建器对象
    builder = x509.CertificateBuilder()
    builder = builder.subject_name(subject)
    builder = builder.issuer_name(issuer)
    builder = builder.public_key(private_key.public_key())
    builder = builder.serial_number(serial_number)
    builder = builder.not_valid_before(valid_from)
    builder = builder.not_valid_after(valid_until)
    # 添加扩展(可选,这里简单示例一个基本扩展)
    builder = builder.add_extension(
        x509.BasicConstraints(ca=True, path_length=None),
        critical=True
    )

    # 使用私钥对证书进行签名
    certificate = builder.sign(
        private_key=private_key,
        algorithm=hashes.SHA256(),
        backend=default_backend()
    )

    # 将证书序列化并保存到文件
    with open('self_signed_certificate.pem', 'wb') as f:
        f.write(certificate.public_bytes(serialization.Encoding.PEM))

    print("自签名证书生成成功,已保存到文件。")

3. 证书验证代码

收起

python

from cryptography import x509
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization
from cryptography.x509.oid import NameOID
import datetime


def verify_certificate():
    """
    验证自签名证书的有效性,包括有效期、签名等方面
    """
    # 加载证书文件
    with open('self_signed_certificate.pem', 'rb') as cert_file:
        certificate = x509.load_pem_x509_certificate(
            cert_file.read(),
            backend=default_backend()
        )

    # 加载对应的私钥(用于验证签名,这里假设私钥是可信的已有的)
    with open('private_key.pem', 'rb') as key_file:
        private_key = serialization.load_pem_private_key(
            key_file.read(),
            password=None,
            backend=default_backend()
        )

    # 验证证书有效期
    if certificate.not_valid_before > datetime.datetime.utcnow():
        print("证书未生效")
        return
    if certificate.not_valid_after < datetime.datetime.utcnow():
        print("证书已过期")
        return

    # 验证证书签名(对比公钥和签名信息)
    try:
        public_key = certificate.public_key()
        public_key.verify(
            certificate.signature,
            certificate.tbs_certificate_bytes,
            padding=x509.PKCS1v15(),
            algorithm=certificate.signature_hash_algorithm
        )
        print("证书签名验证通过")
    except:
        print("证书签名验证失败")
        return

    # 验证证书主体信息等(简单示例,可根据实际详细核对)
    if certificate.subject.get_attributes_for_oid(NameOID.COMMON_NAME)[0].value!= "example.com":
        print("证书主体名称不匹配")
        return

    print("证书验证成功")

4. 主函数调用示例

收起

python

if __name__ == "__main__":
    # 生成密钥对
    generate_key_pair()
    # 创建自签名证书
    create_self_signed_certificate()
    # 验证证书
    verify_certificate()

使用时,你可以将上述代码保存到一个.py文件中(例如pki_certificate_example.py),确保已经安装了cryptography库(可以通过pip install cryptography命令安装),然后在命令行中运行该 Python 文件(例如python pki_certificate_example.py),就可以看到相应的输出结果,依次完成密钥对生成、自签名证书创建以及证书验证的操作流程。

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

Python3.8

Python3.8

Conda
Python

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

区块链起源于比特币,2008年11月1日,一位自称中本聪(Satoshi Nakamoto)的人发表了《比特币:一种点对点的电子现金系统》一文 4  ,阐述了基于P2P网络技术、加密技术、时间戳技术、区块链技术等的电子现金系统的构架理念,这标志着比特币的诞生。两个月后理论步入实践,2009年1月3日第一个序号为0的创世区块诞生。几天后2009年1月9日出现序号为1的区块,并与序号为0的创世区块相连接形成了链,标志着区块链的诞生 5  。近年来,世界对比特币的态度起起落落,但作为比特币底层技术之一的区块链技术日益受到重视。在比特币形成过程中,区块是一个一个的存储单元,记录了一定时间内各个区块节点全部的交流信息。各个区块之间通过随机散列(也称哈希算法)实现链接,后一个区块包含前一个区块的哈希值,随着信息交流的扩大,一个区块与一个区块相继接续,形成的结果就叫区块链 6  。什么是区块链?从科技层面来看,区块链涉及数学、密码学、互联网和计算机编程等很多科学技术问题。从应用视角来看,简单来说,区块链是一个分布式的共享账本和数据库,具有去中心化、不可篡改、全程留痕、可以追溯、集体维护、公开透明等特点。这些特点保证了区块链的“诚实”与“透明”,为区块链创造信任奠定基础。而区块链丰富的应用场景,基本上都基于区块链能够解决信息不对称问题,实现多个主体之间的协作信任与一致行动 7  。区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。区块链(Blockchain),是比特币的一个重要概念,它本质上是一个去中心化的数据库,同时作为比特币的底层技术,是一串使用密码学方法相关联产生的数据块,每一个数据块中包含了一批次比特币网络交易的信息,用于验证其信息的有效性(防伪)和生成下一个区块 8  。比特币白皮书英文原版 4  其实并未出现 blockchain 一词,而是使用的 chain of blocks。最早的比特币白皮书中文翻译版 9  中,将 chain of blocks 翻译成了区块链。这是“区块链”这一中文词最早的出现时间。国家互联网信息办公室2019年1月10日发布《区块链信息服务管理规定》,自2019年2月15日起施行 1  。作为核心技术自主创新的重要突破口,区块链的安全风险问题被视为当前制约行业健康发展的一大短板,频频发生的安全事件为业界敲响警钟。拥抱区块链,需要加快探索建立适应区块链技术机制的安全保障体系。 102008年由中本聪第一次提出了区块链的概念 4  ,在随后的几年中,区块链成为了电子货币比特币的核心组成部分:作为所有交易的公共账簿。通过利用点对点网络和分布式时间戳服务器,区块链数据库能够进行自主管理。为比特币而发明的区块链使它成为第一个解决重复消费问题的数字货币。比特币的设计已经成为其他应用程序的灵感来源。2014年,区块链2.0”成为一个关于去中心化区块链数据库的术语。对这个第二代可编程区块链,经济学家们认为它是一种编程语言,可以允许用户写出更精密和智能的协议 11  。因此,当利润达到一定程度的时候,就能够从完成的货运订单或者共享证书的分红中获得收益。区块链2.0技术跳过了交易和“价值交换中担任金钱和信息仲裁的中介机构”。它们被用来使人们远离全球化经济,使隐私得到保护,使人们“将掌握的信息兑换成货币”,并且有能力保证知识产权的所有者得到收益。第二代区块链技术使存储个人的“永久数字ID和形象”成为可能,并且对“潜在的社会财富分配”不平等提供解决方案 12  。2016年1月20日,中国人民银行数字货币研讨会宣布对数字货币研究取得阶段性成果。会议肯定了数字货币在降低传统货币发行等方面的价值,并表示央行在探索发行数字货币。中国人民银行数字货币研讨会的表达大大增强了数字货币行业信心。这是继2013年12月5日央行五部委发布关于防范比特币风险的通知之后,第一次对数字货币表示明确的态度。 13 2016年12月20日,数字货币联盟——中国FinTech数字货币联盟及FinTech研究院正式筹建 14  。如今,比特币仍是数字货币的绝对主流,数字货币呈现了百花齐放的状态,常见的有bitcoin、litecoin、dogecoin、dashcoin,除了货币的应用之外,还有各种衍生应用,如以太坊Ethereum、Asch等底层应用开发平台以及NXT,SIA,比特股,MaidSafe,Ripple等行业应用 15  。公有区块链公有区块链(Public Block Chains)是指:世界上任何个体或者团体都可以发送交易,且交易能够获得该区块链的有效确认,任何人都可以参与其共识过程。公有区块链是最早的区块链,也是应用最广泛的区块链,各大bitcoins系列的虚拟数字货币均基于公有区块链,世界上有且仅有一条该币种对应的区块链 16  。联合(行业)区块链行业区块链(C
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芊言凝语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值