访问M2Crypto中的CSR扩展堆栈

时间:2011-01-03 00:07:29

标签: python openssl m2crypto

我有一个添加了扩展堆栈的证书签名请求。在根据此请求构建证书时,我希望能够访问该堆栈以用于创建最终证书。

但是,虽然M2Crypto.X509.X509有许多帮助者可以访问扩展程序(get_extget_ext_at等),但M2Crypto.X509.Request似乎只提供了添加扩展程序的成员,但无法检查已与给定对象关联的扩展名。

我在这里错过了什么吗?

2 个答案:

答案 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'])