2013-10-03 28 views
0

我在使用OpenSSL提供的示例创建带有v3扩展名的证书请求时出现问题。这个完整的代码可以在OpenSSL/demo/x509/将AuthorityKeyIdentifier添加到CertRequest

中的mkreq.c中找到。

将一些x509v3扩展添加到证书请求是行之有效的。 我可以添加密钥使用或主题Alt名称

add_ext(exts, NID_key_usage, "critical,digitalSignature,keyEncipherment"); 
add_ext(exts, NID_subject_alt_name, "email:[email protected]"); 

,但是当我尝试添加一个执行authorityKeyIdentifier这是不工作...

add_ext(exts, NID_authority_key_identifier, "keyid,issuer"); 

也是在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; 
} 

难道有人有线索为什么一些扩展工作,有些不是?当我为自签名添加相同的扩展名时,它的工作良好...

回答

0

经过一段时间的研究后,似乎这是不可能的,因为您在创建证书请求时不知道CA.

0

我觉得以下值得分享,但我不确定这与你的情况有关。

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

subjectKeyIdentifier = hash 
authorityKeyIdentifier = keyid,issuer 

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

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

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

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