3

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

然而,虽然M2Crypto.X509.X509有许多用于访问扩展的助手(get_extget_ext_at),M2Crypto.X509.Request但似乎只提供了一个用于添加扩展的成员,但无法检查已经与给定对象关联的扩展。

我在这里错过了什么吗?

4

2 回答 2

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 应该不难。

于 2011-01-04T00:48:33.827 回答
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'])

等等

于 2014-03-06T21:27:48.937 回答