我有一个添加了扩展堆栈的证书签名请求。根据此请求构建证书时,我希望能够访问该堆栈以用于创建最终证书。
然而,虽然M2Crypto.X509.X509
有许多用于访问扩展的助手(get_ext
等get_ext_at
),M2Crypto.X509.Request
但似乎只提供了一个用于添加扩展的成员,但无法检查已经与给定对象关联的扩展。
我在这里错过了什么吗?
你是对的。
当前版本的 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 应该不难。
对于其他通过类似的谷歌搜索找到这个问题的人,我来到了这里。
面对类似的问题,而且看不到 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'])
等等