我有一个添加了扩展堆栈的证书签名请求。在根据此请求构建证书时,我希望能够访问该堆栈以用于创建最终证书。
但是,虽然M2Crypto.X509.X509
有许多帮助者可以访问扩展程序(get_ext
,get_ext_at
等),但M2Crypto.X509.Request
似乎只提供了添加扩展程序的成员,但无法检查已与给定对象关联的扩展名。
我在这里错过了什么吗?
答案 0 :(得分: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背景,那么公开新的API应该不难。
答案 1 :(得分: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'])
等