OpenSSL 3.x CLI (openssl s_client / openssl verify)OpenSSL CLI
错误信息
verify error:num=79:invalid CA certificate
也可能输出为
- error 79 at 1 depth lookup: invalid CA certificate
OpenSSL 3.0.13 和 3.5.7 都把这种情况报告为错误 79(较早的资料把“invalid CA certificate”列为错误 24,这个错误码仍然存在,用于其他 CA 检查)。对于同一张证书,s_client 还会输出错误 26“unsuitable certificate purpose”,而它的汇总行显示的是最后这个代码。
OpenSSL 3.x CLI (openssl s_client / openssl verify) — X509_V_ERR_INVALID_CA
含义
OpenSSL 错误 79(X509_V_ERR_INVALID_CA):证书链中处于颁发者位置的某张证书不是有效的 CA 证书——它的 basicConstraints 为 CA:FALSE 或缺失,或者它的 keyUsage 不允许对证书签名。openssl verify 消息中的深度指向出问题的那张证书(1 是第一张中间证书)。
原因
颁发者是终端实体证书
常见用服务器证书或客户端证书的密钥签名的证书,常见于手工编写的 PKI 脚本。
CA 证书缺少 keyCertSign
偶见keyUsage 中没有 keyCertSign 的中间证书,即使设置了 CA:TRUE,也不能用作颁发者。
超出了路径长度约束
罕见位于 pathlen:0 的 CA 之下的中间证书不会被接受为颁发者;调整层级结构,或者用合适的 pathlen 重新签发。
修复方法
- 1.
查看所报告深度处的证书
basicConstraints 必须为 CA:TRUE(并标记为关键扩展),并且 keyUsage 必须包含 keyCertSign。
bash # The certificate at the depth named in the error must be a CA openssl x509 -in int.pem -noout -subject -ext basicConstraints,keyUsage - 2.
将中间证书重新签发为 CA 证书
带上 CA 扩展重新签名;只要密钥和主体不变,它已签发的证书仍然有效。
bash printf 'basicConstraints=critical,CA:TRUE,pathlen:0\nkeyUsage=critical,keyCertSign,cRLSign\n' > ca.ext openssl x509 -req -in int.csr -CA root.pem -CAkey root.key -days 1825 -extfile ca.ext -out int.pem
相关错误
x509: invalid signature: parent certificate cannot sign this kind of certificateGo crypto/x509verify error:num=26:unsuitable certificate purposeOpenSSL CLI (openssl s_client / openssl verify -purpose)verify error:num=20:unable to get local issuer certificateOpenSSL CLI (openssl s_client / openssl verify)