在CSR中添加扩展生成中间证书时CA属性异常问题求助
我正在为中间CA证书生成证书签名请求(CSR),需要在CSR中添加basic constraints扩展并设置CA:TRUE。当前使用OpenSSL C代码实现,但证书被签名后,Basic Constraints里的CA值却变成了false,不知道问题出在哪里。
我的代码如下:
// 添加扩展的核心代码 exts = sk_X509_EXTENSION_new_null(); add_ext(exts, x509_req, NID_basic_constraints, "critical,CA:TRUE"); X509_REQ_add_extensions(x509_req, exts); sk_X509_EXTENSION_pop_free(exts, X509_EXTENSION_free); // add_ext函数实现 int add_ext(STACK_OF(X509_EXTENSION) *sk, X509_REQ* req, int nid, char *value) { X509_EXTENSION *ex; X509V3_CTX ctx; X509V3_set_ctx_nodb(&ctx); X509V3_set_ctx(&ctx, NULL, NULL, req, NULL, 0); ex = X509V3_EXT_conf_nid(NULL, &ctx, nid, value); if (!ex) { log("X509V3_EXT_conf_nid generated error", cspsdk::Logging::LOG_LEVEL_INFO); return 0; } sk_X509_EXTENSION_push(sk, ex); return 1; }
恳请各位帮忙指出问题所在,谢谢!
让我来帮你一步步排查这个问题——我之前在生成CA层级证书的时候也踩过类似的坑,大概率是两个环节出了问题:CSR本身的扩展没生成对,或者签名的时候被CA的配置覆盖了。
第一步:先确认你的CSR是不是真的带了正确的Basic Constraints扩展
别着急看最终证书,先把生成的CSR导出来用OpenSSL命令行检查一下:
openssl req -in your_generated.csr -text -noout
如果输出里的X509v3 Basic Constraints显示的是CA:TRUE, critical,那说明你的CSR代码没问题,问题出在签名环节;如果这里就是CA:FALSE,那咱们就聚焦在CSR生成代码上。
如果CSR本身不对:检查X509V3_CTX的上下文设置
你的add_ext函数里,X509V3_set_ctx的最后一个参数用了0,这可能让OpenSSL搞不清楚你是在给CSR还是证书加扩展。试试把这个参数改成X509V3_CTX_REQ,明确告诉它我们正在处理CSR的扩展:
X509V3_set_ctx(&ctx, NULL, NULL, req, NULL, X509V3_CTX_REQ);
这个枚举值是专门用来标识CSR扩展上下文的,之前的0属于默认值,有时候会导致扩展生成不符合预期。
另外,建议给X509_REQ_add_extensions加个错误检查,看看扩展是不是真的成功添加到CSR里了:
if (!X509_REQ_add_extensions(x509_req, exts)) { ERR_print_errors_fp(stderr); // 打印OpenSSL的具体错误信息 return -1; }
这样能快速定位是不是添加扩展的过程中出了错。
如果CSR是对的,但签名后证书不对:检查签名CA的配置
很多时候,签发证书的CA(比如根CA)会忽略CSR里的扩展,而是用自己的配置文件强制设置证书属性。比如如果根CA的openssl.cnf里默认写了basicConstraints = CA:FALSE,那不管你的CSR里怎么设,最终证书都会被覆盖成FALSE。
解决办法有两个:
- 修改签名CA的配置文件,加上
copy_extensions = copy,这样CA会把CSR里的扩展复制到新证书里; - 在签名的C代码里,显式给新生成的证书添加
Basic Constraints扩展,而不是完全依赖CSR的内容。比如在生成X509对象后,调用类似你写的add_ext函数(注意要把参数改成X509*类型的证书,而不是X509_REQ*)。
最后再提个小细节
确保你的critical标记是对的——中间CA的Basic Constraints确实需要设为critical,你的代码里写的是对的,但如果签名CA的配置里强制去掉了critical标记,也可能间接影响CA值的识别,不过这个概率比较小。
先从检查CSR开始吧,大概率能找到问题所在!
内容的提问来源于stack exchange,提问作者shery6405

