使用M2Crypto创建任意X509扩展
我想创建一个包含任意扩展的证书签名请求(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”。