如何在Python中为X.509 CSR添加自定义属性(如Industry、InvoiceType)
在Python中给X.509 CSR添加非标准自定义属性
你的代码目前是生成X.509证书而非CSR(证书签名请求),且直接给Subject添加自定义字段的方式不可行——Subject的字段对应预定义的OID,非标准属性需要通过X.509扩展或PKCS#9属性实现。以下是正确的实现方式:
关键修正点
- 改用
crypto.X509Req创建CSR对象(X509用于生成证书,不符合你的需求) - 自定义属性需绑定私有OID(可自行定义
1.2.3.4.5.x这类符合格式的私有段OID) - 通过扩展或属性接口添加自定义字段,而非直接修改Subject
完整实现代码
from OpenSSL import crypto def csr_gen( commonName="commonName", organizationUnitName="organizationUnitName", organizationName="organizationName", countryName="NT", location="location", industry="Manufacturing", invoiceType="Electronic", PRIV_KEY_FILE="private.key", CSR_FILE="csr.pem" ): # 生成RSA密钥对 key = crypto.PKey() key.generate_key(crypto.TYPE_RSA, 4096) # 创建CSR对象 csr = crypto.X509Req() subject = csr.get_subject() # 设置标准Subject字段 subject.CN = commonName subject.C = countryName subject.L = location subject.O = organizationName subject.OU = organizationUnitName # 注册自定义OID与字段名的映射(用于在CSR中显示友好名称) industry_oid = "1.2.3.4.5.6.7.8" invoicetype_oid = "1.2.3.4.5.6.7.9" crypto.X509Req.add_extra_oid(industry_oid, "Industry") crypto.X509Req.add_extra_oid(invoicetype_oid, "InvoiceType") # 添加自定义PKCS#9属性(会显示在CSR的Attributes段下) csr.add_attribute(industry_oid, industry) csr.add_attribute(invoicetype_oid, invoiceType) # 用私钥签名CSR csr.sign(key, 'sha512') # 保存私钥和CSR文件 with open(PRIV_KEY_FILE, "wt") as f: f.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, key).decode("utf-8")) with open(CSR_FILE, "wt") as f: f.write(crypto.dump_certificate_request(crypto.FILETYPE_PEM, csr).decode("utf-8")) csr_gen()
验证自定义属性
使用OpenSSL命令查看CSR内容,可看到自定义属性:
openssl req -in csr.pem -text -noout
输出中会在Attributes段下显示Industry和InvoiceType字段及对应值。
内容的提问来源于stack exchange,提问作者Starlight
相关产品推荐
相关产品推荐

