使用M2Crypto创建任意X509扩展

时间:2014-03-07 11:10:20

标签: python x509 m2crypto

我有兴趣创建一个包含OID指定的任意扩展的CSR。理想情况下,我希望将值设置为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之外,没有办法添加自己的字符串。

The documentation表示可以通过编辑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 个答案:

答案 0 :(得分: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"和"无"分别。