OpenSSL自签名CA证书验证报错及有效生成方案问询
自签名CA证书生成问题与解决方案
操作背景
我使用以下命令生成自签名CA证书:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -sha256 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt -subj "/C=DE/O=Debug cert/CN=localhost" -extensions v3_ca -config /home/me/openssl.config
对应的openssl.config内容:
[ extensions ] keyUsage = cRLSign # encipherOnly, keyEncipherment, keyCertSign [ v3_ca ] basicConstraints = CA:TRUE subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer keyUsage = cRLSign, keyCertSign
通过证书验证工具检测时,得到以下错误:
cablint ERROR CA certificates must include keyUsage extension cablint ERROR CA:TRUE without keyCertSign cablint INFO CA certificate identified x509lint ERROR No key usage x509lint INFO Checking as root CA certificate zlint ERROR CAs MUST NOT issue certificates that have authority key IDs that include both the key ID and the issuer's issuer name and serial number zlint ERROR Root and Subordinate CA certificate keyUsage extension MUST be present zlint ERROR Root CA certificates MUST have Key Usage Extension Present
疑问
- 明明配置了
keyUsage,为何仍出现相关错误? - 明明配置了
keyCertSign,为何出现“CA:TRUE without keyCertSign”错误? - 如何生成用于调试的有效自签名SSL CA证书?
另外,Android开发者官网的HTTPS调试教程中提到的-config openssl_config.txt对应的配置文件缺失,默认/etc/ssl/openssl.cnf无法满足需求,该配置文件应包含什么内容?
错误原因分析
- keyUsage不生效:你的配置文件缺少
[req]核心段,未指定x509_extensions = v3_ca关联扩展配置,导致-extensions v3_ca参数未正确加载[v3_ca]中的设置,最终生成的证书根本没有包含keyUsage扩展,因此各检测工具报错。 - CA:TRUE无keyCertSign:同上,由于
keyUsage扩展未被添加到证书中,工具检测到证书标记为CA,但没有对应的签发证书权限,触发错误。 - authorityKeyIdentifier错误:根CA证书的
authorityKeyIdentifier不应包含issuer——根CA的签发者就是自身,添加issuer违反X.509规范,仅保留keyid即可。
有效自签名CA证书生成方案
1. 正确的OpenSSL配置文件(示例命名为ca-debug.cnf)
[req] default_bits = 2048 prompt = no default_md = sha256 distinguished_name = dn x509_extensions = v3_ca [dn] C = DE O = Debug cert CN = Local Debug CA [v3_ca] basicConstraints = critical, CA:TRUE subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always keyUsage = critical, cRLSign, keyCertSign
配置说明:
[req]段是必填核心,通过x509_extensions关联v3_ca扩展配置basicConstraints添加critical标记(CA证书必须的关键扩展)authorityKeyIdentifier使用keyid:always,强制根CA生成该扩展且仅包含密钥IDkeyUsage添加critical标记,明确CA所需的cRLSign(吊销列表签名)和keyCertSign(签发证书)权限
2. 生成命令
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -sha256 \ -keyout /etc/ssl/private/debug-ca.key \ -out /etc/ssl/certs/debug-ca.crt \ -config ca-debug.cnf
如果需要自定义主体信息,可保留-subj参数覆盖配置文件中的[dn]段内容。
Android调试教程缺失配置补充
Android官网教程中需要的openssl_config.txt可使用以下简化配置(满足调试场景合规要求):
[req] x509_extensions = v3_ca prompt = no distinguished_name = dn [dn] C = US O = Android Debug CN = localhost [v3_ca] basicConstraints = CA:TRUE keyUsage = cRLSign, keyCertSign subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always
内容的提问来源于stack exchange,提问作者Torsten
相关产品推荐
相关产品推荐

