在M2Crypto中访问CSR扩展栈
我有一个带有扩展堆栈的证书签名请求。在根据这个请求生成证书时,我希望能够访问这个堆栈,以便在创建最终证书时使用。
不过,虽然 M2Crypto.X509.X509
提供了一些帮助函数来访问扩展(比如 get_ext
、get_ext_at
等),但是 M2Crypto.X509.Request
似乎只提供了一个添加扩展的功能,却没有办法查看已经和某个对象关联的扩展。
我是不是漏掉了什么?
2 个回答
2
给那些通过类似的谷歌搜索找到这个问题的人。
当我遇到类似的问题时,发现M2Crypto这个工具有个缺陷没有修复,我决定尝试调用OpenSSL这个工具,并处理它的输出。这个输出看起来和YAML格式差不多,我们可以稍微整理一下,让它看起来像样。
def req_extensions(csrFilename):
cmd = ('openssl req -text -noout -in %s'
% csrFilename)
output = subprocess.check_output(cmd.split(),
stderr=subprocess.STDOUT)
output = re.sub(r': rsaEncryption', ':', output)
output = re.sub(r'[0-9a-f]{2}:', '', output)
return yaml.load(output)
然后……
csrExt = self.req_extensions('my.csr')
keyUsage = (
csrExt['Certificate Request']['Data']['Requested Extensions']
['X509v3 Key Usage'])
SAN = (
csrExt['Certificate Request']['Data']['Requested Extensions']
['X509v3 Subject Alternative Name'])
等等。
2
你说得对。
现在的M2Crypto版本没有提供必要的OpenSSL接口 - X509_REQ_get_extensions
。
为了让你了解这其中涉及的C语言内容:
X509_REQ *req = /* ... */;
STACK_OF(X509_EXTENSION) *exts = X509_REQ_get_extensions(req);
int count = sk_X509_EXTENSION_num(exts);
int i;
for (i = 0; i < count; ++i) {
X509_EXTENSION *ext = sk_X509_EXTENSION_value(exts, i);
/* Do something with ext */
}
sk_X509_EXTENSION_pop_free(exts, X509_EXTENSION_free);
因为M2Crypto使用SWIG来封装C代码,如果你对C语言有一定了解,应该不难添加一个新的接口。