在M2Crypto中访问CSR扩展栈

3 投票
2 回答
1036 浏览
提问于 2025-04-16 09:19

我有一个带有扩展堆栈的证书签名请求。在根据这个请求生成证书时,我希望能够访问这个堆栈,以便在创建最终证书时使用。

不过,虽然 M2Crypto.X509.X509 提供了一些帮助函数来访问扩展(比如 get_extget_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语言有一定了解,应该不难添加一个新的接口。

撰写回答