如何用Python OpenSSL为X.509证书添加Issuer Alternative Name扩展?
回答:是的,可以通过扩展添加Issuer Alternative Name
完全正确,Issuer Alternative Name(简称IAN)是X.509标准定义的扩展字段,确实需要通过crypto.X509Extension来添加,这和你当前使用的basicConstraints、keyUsage扩展逻辑完全一致。
具体修改步骤
- 理解IAN的格式:IAN支持多种类型的标识,常见的包括DNS域名、IP地址、邮箱等,格式为
类型:值,多个值用逗号分隔,比如:DNS:issuer.example.com, IP:192.168.0.1, email:issuer@example.com - 在扩展列表中添加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
相关产品推荐
相关产品推荐

