将 AuthorityKeyIdentifier 添加到 CertRequest

Cam*_* G. 2 c openssl x509certificate x509

我在使用 OpenSSL 提供的示例创建带有 v3 扩展的证书请求时遇到问题。整个代码可以在 Openssl/demos/x509/ 的 mkreq.c 中找到

在证书请求中添加一些 x509v3 扩展效果很好。我可以添加密钥用法或主题替代名称

add_ext(exts, NID_key_usage, "critical,digitalSignature,keyEncipherment");
add_ext(exts, NID_subject_alt_name, "email:steve@openssl.org");
Run Code Online (Sandbox Code Playgroud)

但是当我尝试添加 AuthorityKeyIdentifier 时,这不起作用......

add_ext(exts, NID_authority_key_identifier, "keyid,issuer");
Run Code Online (Sandbox Code Playgroud)

mkreq 中还提供了 add_ext :

int add_ext(STACK_OF(X509_REQUEST) *sk, int nid, char *value)
{
X509_EXTENSION *ex;
ex = X509V3_EXT_conf_nid(NULL, NULL, nid, value);
if (!ex)
    return 0;
sk_X509_EXTENSION_push(sk, ex);

return 1;
}
Run Code Online (Sandbox Code Playgroud)

有人知道为什么有些扩展有效而有些无效吗?当我为自签名添加相同的扩展时,它运行良好......

Phi*_* A. 6

我发现以下内容值得分享,尽管我不确定这是否与您的情况相关。

在命令行上生成自签名证书时,某些扩展的顺序很重要。如果您希望将 keyid 用作权限密钥 id,则必须先声明 subjectKeyIdentifier。

subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid,issuer
Run Code Online (Sandbox Code Playgroud)

在这种情况下,authorityKeyIdentifier 将填充 keyid,并且不会使用颁发者。

如果您以相反的顺序声明,authorityKeyIdentifier 将改为填写发行者。可能是因为程序尝试根据 subjectKeyIdentifier 初始化authorityKeyIdentifier。

如果您声明了authorityKeyIdentifier = keyid:always,则会引发硬错误,因为 keyid 未知。

我希望它能帮助某人。我花了一段时间才解决这个问题。