欢迎访问宙启技术站
智能推送

使用Python的cryptography.x509库生成自签名证书链

发布时间:2023-12-26 11:35:38

Python的cryptography.x509库是一个用于处理X.509证书的库,其中包括生成和解析自签名证书链的功能。本文将演示如何使用该库生成自签名证书链,并提供一个使用例子。

首先,我们需要安装cryptography库。可以使用pip来安装:

pip install cryptography

下面是一个使用cryptography.x509库生成自签名证书链的示例代码:

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

# 生成私钥
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
    backend=default_backend()
)

# 生成自签名根证书
subject = issuer = x509.Name([
    x509.NameAttribute(x509.oid.NameOID.COUNTRY_NAME, 'CN'),
    x509.NameAttribute(x509.oid.NameOID.STATE_OR_PROVINCE_NAME, 'Beijing'),
    x509.NameAttribute(x509.oid.NameOID.LOCALITY_NAME, 'Beijing'),
    x509.NameAttribute(x509.oid.NameOID.ORGANIZATION_NAME, 'Example Inc.'),
    x509.NameAttribute(x509.oid.NameOID.COMMON_NAME, 'Root CA'),
])

root_cert = x509.CertificateBuilder().subject_name(subject).issuer_name(issuer).public_key(
    private_key.public_key()
).serial_number(
    x509.random_serial_number()
).not_valid_before(
    datetime.datetime.utcnow()
).not_valid_after(
    datetime.datetime.utcnow() + datetime.timedelta(days=365)
).add_extension(
    x509.BasicConstraints(ca=True, path_length=None), critical=True
).sign(
    private_key, hashes.SHA256(), default_backend()
)

# 生成自签名中间证书
subject = issuer = x509.Name([
    x509.NameAttribute(x509.oid.NameOID.COUNTRY_NAME, 'CN'),
    x509.NameAttribute(x509.oid.NameOID.STATE_OR_PROVINCE_NAME, 'Beijing'),
    x509.NameAttribute(x509.oid.NameOID.LOCALITY_NAME, 'Beijing'),
    x509.NameAttribute(x509.oid.NameOID.ORGANIZATION_NAME, 'Example Inc.'),
    x509.NameAttribute(x509.oid.NameOID.COMMON_NAME, 'Intermediate CA'),
])

intermediate_cert = x509.CertificateBuilder().subject_name(subject).issuer_name(
    root_cert.subject
).public_key(
    private_key.public_key()
).serial_number(
    x509.random_serial_number()
).not_valid_before(
    datetime.datetime.utcnow()
).not_valid_after(
    datetime.datetime.utcnow() + datetime.timedelta(days=365)
).add_extension(
    x509.BasicConstraints(ca=True, path_length=None), critical=True
).sign(
    private_key, hashes.SHA256(), default_backend()
)

# 生成自签名终端证书
subject = x509.Name([
    x509.NameAttribute(x509.oid.NameOID.COUNTRY_NAME, 'CN'),
    x509.NameAttribute(x509.oid.NameOID.STATE_OR_PROVINCE_NAME, 'Beijing'),
    x509.NameAttribute(x509.oid.NameOID.LOCALITY_NAME, 'Beijing'),
    x509.NameAttribute(x509.oid.NameOID.ORGANIZATION_NAME, 'Example Inc.'),
    x509.NameAttribute(x509.oid.NameOID.COMMON_NAME, 'www.example.com'),
])

terminal_cert = x509.CertificateBuilder().subject_name(subject).issuer_name(
    intermediate_cert.subject
).public_key(
    private_key.public_key()
).serial_number(
    x509.random_serial_number()
).not_valid_before(
    datetime.datetime.utcnow()
).not_valid_after(
    datetime.datetime.utcnow() + datetime.timedelta(days=365)
).add_extension(
    x509.SubjectAlternativeName([
        x509.DNSName('www.example.com'),
        x509.DNSName('example.com'),
    ]),
    critical=False
).sign(
    private_key, hashes.SHA256(), default_backend()
)

# 将证书序列化为PEM格式
root_cert_pem = root_cert.public_bytes(serialization.Encoding.PEM)
intermediate_cert_pem = intermediate_cert.public_bytes(serialization.Encoding.PEM)
terminal_cert_pem = terminal_cert.public_bytes(serialization.Encoding.PEM)

# 输出生成的自签名证书链
print("Root Certificate:")
print(root_cert_pem.decode())
print("Intermediate Certificate:")
print(intermediate_cert_pem.decode())
print("Terminal Certificate:")
print(terminal_cert_pem.decode())

这个例子生成了一个由根证书、中间证书和终端证书构成的自签名证书链。每个证书使用自签名者的私钥对其数据进行签名,并包含一个公开的公钥来进行验证。根证书在证书链的顶端,终端证书在底部。

使用该例子中生成的证书链,我们可以用于建立信任,以便在实际应用中验证服务器的身份或支持公钥加密等功能。

总结起来,本文演示了如何使用cryptography.x509库生成自签名证书链,并提供了一个使用例子。通过了解和使用这些库和功能,我们可以更好地理解和应用X.509证书的相关知识。请在实际使用中进行适当的修改和扩展。