使用M2Crypto创建任意X509扩展

2 投票
1 回答
1550 浏览
提问于 2025-04-17 21:17

我想创建一个包含任意扩展的证书签名请求(CSR),这些扩展是通过一个OID(对象标识符)来指定的。理想情况下,我希望这个值是一个ASN1编码的实体,不过把它设置成一个字符串也可以。

网上有很多示例代码,比如下面这样的:

extensionStack = X509.X509_Extension_Stack()
extension = X509.new_extension('subjectAltName', 'DNS:example.com')
extensionStack.push(extension)
request.add_extensions(extensionStack)

这个扩展是从一个预定义的名称,比如 subjectAltName 创建的,然后这个名称会被映射到正确的OID。显然,这些字符串是在objects.txt 文件中定义的,除了重新编译OpenSSL之外,没有办法添加你自己的扩展。

文档提到,可以通过编辑 openssl.cnf 文件来添加自定义的X509扩展。不过我理解的是,这只会影响那些从命令行调用OpenSSL的操作。

那么,如何在M2Crypto中做到这一点呢?换句话说,如何让它的工作方式大致和这个一样?

X509.new_extension('OID:1.2.3.4.5.42', 'test')
#or this
X509.new_extension('OID:1.2.3.4.5.42', '0x1E4...819')

1 个回答

1

你差不多就快成功了:

ext = X509.new_extension('1.2.3.4', 
                         'ASN1:UTF8String:Some random data')
# If required: ext.set_critical(1)
cert.add_ext(ext)

它会出现在OpenSSL的输出中:

                1a:91:ca:bf:aa:ba:3b:49:57
            Exponent: 65537 (0x10001)
    X509v3 extensions:
        X509v3 Subject Alternative Name: 
            DNS:foobar.example.com
        1.2.3.4: 
            ..Some random data
Signature Algorithm: sha1WithRSAEncryption
    18:24:4c:42:fe:7c:71:a6:58:ed:be:9d:2e:9e:ea:a7:80:0f:

不过,M2Crypto在获取自定义扩展时有个问题,除非这些扩展先被注册,否则它无法获取到,而这些功能现在在M2Crypto中是无法使用的。这样的话,名称和数值会显示为“UNDEF”和“None”。

撰写回答