You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python OpenSSL为X.509证书添加Issuer Alternative Name扩展?

回答:是的,可以通过扩展添加Issuer Alternative Name

完全正确,Issuer Alternative Name(简称IAN)是X.509标准定义的扩展字段,确实需要通过crypto.X509Extension来添加,这和你当前使用的basicConstraints、keyUsage扩展逻辑完全一致。

具体修改步骤

  1. 理解IAN的格式:IAN支持多种类型的标识,常见的包括DNS域名、IP地址、邮箱等,格式为类型:值,多个值用逗号分隔,比如:
    DNS:issuer.example.com, IP:192.168.0.1, email:issuer@example.com
    
  2. 在扩展列表中添加IAN:在你现有的cert.add_extensions()调用里,新增一个crypto.X509Extension实例,指定扩展名为"issuerAltName"即可。

修改后的完整代码

from OpenSSL import crypto

def generate_self_signed_cert(cert_dir, is_valid=True):
    """Generate a SSL certificate. If the cert_path and the key_path are present they will be overwritten. """
    # Keys
    private_key = crypto.load_privatekey(crypto.FILETYPE_PEM, open("/root/Desktop/Key2", "rb").read())
    public_key = crypto.load_publickey(crypto.FILETYPE_PEM, open("/root/Desktop/Key1", "rb").read())

    # create a self-signed cert
    cert = crypto.X509()
    cert.get_subject().C = 't'
    cert.get_subject().ST = 't'
    cert.get_subject().L = 's'
    cert.get_subject().O = 'd'
    cert.get_subject().OU = 'g'
    cert.get_subject().CN = 'g'
    cert.set_serial_number(1)  # 注意:01会被当作八进制处理,建议用十进制整数
    cert.gmtime_adj_notBefore(0)
    cert.gmtime_adj_notAfter(3655555555)
    cert.set_issuer(cert.get_subject())
    cert.set_pubkey(public_key)
    
    # 扩展列表中新增Issuer Alternative Name
    cert.add_extensions([
        crypto.X509Extension("basicConstraints", False, "CA:FALSE"),
        crypto.X509Extension("keyUsage", True, "Digital Signature, Non Repudiation"),
        # 添加Issuer Alternative Name扩展
        crypto.X509Extension("issuerAltName", False, "DNS:issuer.example.com, IP:192.168.1.1")
    ])
    
    cert.set_version(2)
    cert.sign(private_key, 'sha256')

    with open(cert_dir + "Cert.cert", 'w+') as fd:
        fd.write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert))

generate_self_signed_cert("/root/Desktop/")

额外说明

  • 因为你生成的是自签名证书,证书的Issuer和Subject是同一个实体,所以此时IAN的内容通常会和Subject Alternative Name(SAN)一致,但如果你有特殊需求,也可以设置不同的标识。
  • 代码里的set_serial_number(01):Python会把以0开头的数字当作八进制处理,建议直接用十进制整数(比如1)避免潜在问题。
  • 你可以根据实际需求修改IAN的值,比如只保留DNS,或者添加更多类型的标识。

内容的提问来源于stack exchange,提问作者Tibi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:42:34