自签名证书验证报错:certificate signature failure 求助排查
我参照微软Azure应用网关自签名证书文档执行以下命令生成证书:
openssl ecparam -out inboundkey.key -name prime256v1 -genkeyopenssl req -new -sha256 -key inboundkey.key -out rootcsr.csropenssl x509 -req -sha256 -days 365 -in rootcsr.csr -signkey inboundkey.key -out rootCA.crtopenssl ecparam -out key.key -name prime256v1 -genkeyopenssl req -new -sha256 -key key.key -out csr.csropenssl x509 -req -in csr.csr -CA rootCA.crt -CAkey inboundkey.key -CAcreateserial -out certificate.crt -days 365 -sha256
运行命令openssl s_client -connect localhost:443 -servername [DOMAIN] -showcerts -CAfile ./rootCA.crt时,出现如下报错:
depth=1 C = AU, ST = Some-State, O = Internet Widgits Pty Ltd
verify return:1depth=0 C = AU, ST = Some-State, O = Internet Widgits Pty Ltd, CN = mydomain.com
verify error:num=7:certificate signature failure
verify return:1depth=0 C = AU, ST = Some-State, O = Internet Widgits Pty Ltd, CN = mydomain.com
verify return:1
执行openssl verify -no-CAfile -no-CApath -trusted rootCA.crt certificate.crt时,返回certificate.crt: OK。生成证书时我仅填写了FQDN和邮箱地址,未提供其他信息,请问哪里操作有误?
问题根源
第6步签发服务器证书时,未显式指定签名算法-sha256,导致OpenSSL默认使用的签名算法与EC密钥(prime256v1)不兼容,触发了s_client的签名验证失败。openssl verify命令的校验逻辑相对宽松,因此未检测出该问题。
修正方案
修改第6步的命令,添加-sha256参数,确保签名算法与根CA保持一致:
openssl x509 -req -in csr.csr -CA rootCA.crt -CAkey inboundkey.key -CAcreateserial -out certificate.crt -days 365 -sha256
重新生成certificate.crt后,再次执行s_client命令即可通过验证。
额外建议:生成根CA和服务器证书时,尽量保持所有标识字段(如国家、州、组织)一致,避免后续出现不必要的兼容性问题。
内容的提问来源于stack exchange,提问作者Antony

