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

使用Python和Cryptography库来生成和解析X.509证书

发布时间:2023-12-28 11:04:58

X.509是一种公共密钥基础设施(PKI)标准,用于生成和管理数字证书。在Python中,可以使用Cryptography库来生成和解析X.509证书。以下是一个例子,展示了如何使用Python和Cryptography库生成和解析X.509证书。

首先,我们需要安装Cryptography库,可以使用以下命令在命令行中安装:

pip install cryptography

接下来,我们可以使用以下代码生成一个自签名的X.509证书:

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

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

# 创建一个自签名的X.509证书
builder = (
    x509.CertificateBuilder()
        .subject_name(x509.Name([
            x509.NameAttribute(x509.NameOID.COUNTRY_NAME, u"CN"),
            x509.NameAttribute(x509.NameOID.STATE_OR_PROVINCE_NAME, u"Province"),
            x509.NameAttribute(x509.NameOID.LOCALITY_NAME, u"City"),
            x509.NameAttribute(x509.NameOID.ORGANIZATION_NAME, u"Company"),
            x509.NameAttribute(x509.NameOID.COMMON_NAME, u"Example"),
        ]))
        .issuer_name(x509.Name([
            x509.NameAttribute(x509.NameOID.COUNTRY_NAME, u"CN"),
            x509.NameAttribute(x509.NameOID.STATE_OR_PROVINCE_NAME, u"Province"),
            x509.NameAttribute(x509.NameOID.LOCALITY_NAME, u"City"),
            x509.NameAttribute(x509.NameOID.ORGANIZATION_NAME, u"Company"),
            x509.NameAttribute(x509.NameOID.COMMON_NAME, u"Example"),
        ]))
        .not_valid_before(datetime.datetime.now())
        .not_valid_after(datetime.datetime.now() + datetime.timedelta(days=365))
        .serial_number(x509.random_serial_number())
        .public_key(private_key.public_key())
        .add_extension(
            x509.BasicConstraints(ca=False, path_length=None), critical=True,
        )
        .sign(private_key, hashes.SHA256(), default_backend())
)

# 将私钥和证书写入文件
with open("private_key.pem", "wb") as f:
    f.write(private_key.private_bytes(
        encoding=serialization.Encoding.PEM,
        format=serialization.PrivateFormat.PKCS8,
        encryption_algorithm=serialization.NoEncryption()
    ))

with open("certificate.pem", "wb") as f:
    f.write(builder.public_bytes(serialization.Encoding.PEM))

上述代码生成了一个自签名的X.509证书,并将私钥和证书保存在了private_key.pemcertificate.pem文件中。

现在,我们可以使用以下代码来解析X.509证书并获取其中的信息:

from cryptography import x509
from cryptography.hazmat.backends import default_backend
from cryptography.x509.oid import NameOID

# 从文件中加载证书
with open("certificate.pem", "rb") as f:
    cert = x509.load_pem_x509_certificate(f.read(), default_backend())

# 获取证书的不同属性
common_name = cert.subject.get_attributes_for_oid(NameOID.COMMON_NAME)[0].value
organization_name = cert.subject.get_attributes_for_oid(NameOID.ORGANIZATION_NAME)[0].value

# 打印证书相关信息
print("Common Name: ", common_name)
print("Organization Name: ", organization_name)

上述代码从certificate.pem文件中加载X.509证书,并提取了证书的公共名称和组织名称。

通过以上示例,我们可以看到如何使用Python和Cryptography库来生成和解析X.509证书。这只是一个简单的示例,Cryptography库提供了更多功能来处理和操作证书。可以通过阅读Cryptography库的文档来了解更多详细信息并使用更高级的功能。