openssl verify命令-0深度查找时出现错误20:无法获取本地颁发者证书

45

我从PFX证书创建了一个PEM证书并想要验证它。 然而,我遇到了这个问题,尝试找一些答案,但我没有找到,所以我不知道该如何解决它。 你能给些建议吗? 非常感谢。

C:\OpenSSL-Win32\bin>set OPENSSL_CONF=C:\OpenSSL-Win32\bin\openssl.cfg

C:\OpenSSL-Win32\bin>openssl
OpenSSL> verify C:\mycert.pem
C:\mycert.pem: C = CZ, ST = Sprava zakladnich registru, L = "Obec=Praha,Ulice=Na Vapence,PSC=13000", O = 72054506, OU = 4333, CN = tstcawilly.szr.local
error 20 at 0 depth lookup:unable to get local issuer certificate
error in verify
OpenSSL>
OpenSSL> verify -CAfile C:\mycert.pem C:\mycert.pem
C:\mycert.pem: C = CZ, ST = Sprava zakladnich registru, L = "Obec=Praha,Ulice=Na Vapence,PSC=13000", O = 72054506, OU = 4333, CN = tstcawilly.szr.local
error 20 at 0 depth lookup:unable to get local issuer certificate
error in verify
OpenSSL>

我们也遇到了同样的问题,我们获得了一张新的证书并安装在Tomcat服务器上。 - Brian Knoblauch
4个回答

30

OpenSSL> verify -CAfile C:\rootcert.pem C:\mycert.pem

需要添加CA的根证书而非你的终端实体证书,使用-CAfile选项。类似下面这样:

openssl verify -CAfile C:\ca-cert.pem C:\mycert.pem

另外,如果存在中间证书,则需要将其添加到mycert.pem中。因此,mycert.pem实际上将拥有两个(或多个)证书(而不是一个)。

将所有必需的证书添加到mycert.pem中以构建有效的链解决了PKI中众所周知的“哪个目录”问题。本质上,客户端(例如我)不知道从哪里获取缺失的中间证书。


在自签名证书的情况下,自签名证书既是CA证书又是实体证书吗? - Wilbur Whateley
@WilburWhateley - 不行。必须设置基本限制和CA:FALSE。不能设置CA:TRUE。如果CA属性为真,则终端实体证书可以铸造其他证书。 - jww
1
那么自签名证书就不可能了吗?不太清楚。因为在这种情况下只有一个证书,对吧?所以自签名证书不能是CA,而没有CA,你就无法验证...我是否遗漏了什么,或者这通常是SSL的糟糕设计? - Wilbur Whateley
1
@WilburWhateley 我对使用openssl还比较新,但据我所知,openssl默认不信任任何CA,您必须指定要信任哪些CA。此外,您可以使用openssl自己创建CA(CA:TRUE)。因此,要获取自签名证书以进行验证,您需要首先创建您的CA的证书和密钥,然后使用新创建的CA对其进行签名以创建您的“自签名”证书。在那时,您现在可以使用自己的CA来验证您的自签名证书。至少这是我过去48小时左右收集到的信息,并且已在本地工作。 - Darren Felton

5
另一个情况是只有在 basicConstraints 中设置了 CA:TRUE,才能设置 pathlen
示例:
basicConstraints=CA:TRUE,pathlen:10 # Okay
basicConstraints=CA:FALSE,pathlen:10 # Invalid!

谢谢。我因为在我的叶子证书上设置了CA:FALSE,pathlen:0而苦恼了一个小时...证书创建成功了,但是openssl验证失败了。只需简单地更改为CA:FALSE就可以得到可验证的证书。 - Doug Baer
这是正确的答案。 - Marinos An

1

我在使用openssl verify命令时也遇到了问题。我也收到了以下错误信息:

"error 20 at 0 depth lookup:unable to get local issuer certificate"

如果您有一个包含多个中间证书(超过2个证书)的证书链,请参考以下简短说明,正确使用openssl verify命令。

假设我们有以下证书链: my_root_ca.crt > my_intermediate_ca1.crt > my_intermediate_ca2.crt > leaf_cert.crt

openssl verify -CAfile my_root_ca.crt -untrusted all_my_intermediate_ca.crt leaf_cert.crt

my_root_ca.crt: 这是根证书(自签名)

all_my_intermediate_ca.crt: 此文件必须包括两个中间证书(my_intermediate_ca1.crt和my_intermediate_ca2.crt)

leaf_cert.crt: 这是要验证的实际证书。

如果您有多个中间证书,这也可以工作。但您必须将它们全部包含在一个文件中。


0

我发现你可能会面临两个潜在问题。

潜在问题1。 中间证书可能会给你带来问题。

当针对多个中间证书验证我们的新QSeal证书(以PEM格式)时,我为每个中间证书使用了选项-untrusted。 以下是在MacOS / Linux上的示例。

openssl verify -verbose -CAfile ./quovadis_root_ca1g3.pem -untrusted ./quovadis_quovadisenterprisetrustca1g3.pem -untrusted ./quovadis_quovadiseuissuingcertificationauthorityg4.pem ./qseal_new.crt

输出现在为

./qseal_new.crt: OK

潜在问题2。 当使用LibreSSL时,即使修复了中间证书问题,我仍然遇到此问题。切换到OpenSSL解决了这个问题。我知道您使用的是Windows,但其他人在使用OpenSSL替代品时可能会遇到此问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接