Ssl 在叶证书上验证证书链失败
我使用Ssl 在叶证书上验证证书链失败,ssl,openssl,ssl-certificate,pyopenssl,Ssl,Openssl,Ssl Certificate,Pyopenssl,我使用pyopenssl生成了一个PEM证书链(CA、intermediate和leaf),我想确认我正确定义了所有内容 以下是我采取的步骤: 我制作了三个PEM证书,对CA进行了自签名,并定义了基本约束crypto.X509Extension(b'basicConstraints',False,b'CA:TRUE')如下 我将CA和中间证书复制到/usr/local/share/CA证书(作为crt文件)并运行sudo更新CA证书 我已经建立了一个基于 我尝试使用CA证书运行服务器,并执行了o
pyopenssl
生成了一个PEM证书链(CA、intermediate和leaf),我想确认我正确定义了所有内容
以下是我采取的步骤:
crypto.X509Extension(b'basicConstraints',False,b'CA:TRUE')
如下/usr/local/share/CA证书
(作为crt文件)并运行sudo更新CA证书
openssl s_client-connectlocalhost:4433-CApath/etc/ssl/certs
-效果很好,获得了验证返回代码:0(确定)
验证返回代码:0(确定)
验证返回代码:24(无效CA证书)
$ openssl verify 1-ca.pem
1-ca.pem: OK
$ openssl verify 2-intermediate.pem
2-intermediate.pem: OK
$ openssl verify 3-leaf.pem
C = NL, ST = Amsterdam, L = Zaandam, O = FakeDigiCert, OU = FakeFake, CN = www.fakedigicert.nl
error 24 at 1 depth lookup: invalid CA certificate
error 3-leaf.pem: verification failed
为什么一旦服务器的证书离开CA超过一步,CA证书就会突然失效?这似乎是大多数人在设置https web服务器时经常遇到的一个陷阱。您还需要向web服务器提供所有中间证书(通常通过将leaf和中间pem文件合并到一个pem文件中)。因此,当web浏览器访问您的站点时,SSL设置应该从web服务器返回叶证书和中间证书 在opensll命令中使用-showcerts选项时,您可以在所有提供中间证书的网站上看到这一点: openssl命令也是如此 从文档中: -不可信文件 用于从主题构造证书链的附加不受信任证书(中间颁发者CA)文件 信任锚的证书。该文件应包含一个或多个 PEM格式的证书。此选项可以指定多个选项 一次包含来自多个文件的不受信任证书 因此,在上面的示例中,您需要执行以下操作:
openssl verify 3-leaf.pem -untrusted 2-intermediate.pem
这似乎是大多数人在设置https web服务器时经常遇到的一个陷阱。您还需要向web服务器提供所有中间证书(通常通过将leaf和中间pem文件合并到一个pem文件中)。因此,当web浏览器访问您的站点时,SSL设置应该从web服务器返回叶证书和中间证书 在opensll命令中使用-showcerts选项时,您可以在所有提供中间证书的网站上看到这一点: openssl命令也是如此 从文档中: -不可信文件 用于从主题构造证书链的附加不受信任证书(中间颁发者CA)文件 信任锚的证书。该文件应包含一个或多个 PEM格式的证书。此选项可以指定多个选项 一次包含来自多个文件的不受信任证书 因此,在上面的示例中,您需要执行以下操作:
openssl verify 3-leaf.pem -untrusted 2-intermediate.pem
省略中间值确实是一个常见的错误,但它不会导致此问题中显示的特定错误。@dave_thompson_085这是否意味着叶证书在不应该设置时设置了“CA:TRUE”?@ShanePowell看起来dave_thompson_085的解决方案解决了这个问题,但是我希望您能澄清一下。如果我在客户端的主机上安装根证书,然后提供包含所有三个证书的链接文件,s_客户端的检查应该可以吗?因为当我卸载中间证书时,我得到了“验证返回代码:21(无法验证第一个证书)”@GabeL:per-standard SSL/TLS服务器应该发送整个链,除非它可能忽略(非平凡的)根;在您的情况下,它应该至少发送leaf和imed。大多数服务器只发送您配置的内容,但有些服务器会有所不同。如果服务器错误地只发送叶,则标准中没有指定客户端的操作
openssl s_client
特别是,如果您在其信任库中同时拥有root和ime(-CAfile
和/或-CApath
或其默认值),则使用信任库中的ime构建链,验证将成功(如果/一旦证书正确)。Shane:不。正如我在Q上所评论的,导致verify 24的原因是缺少ca=true的中间产物。OpenSSL接受ca=true的“叶”——包括但不限于自签名证书,其中叶也是根,必须直接信任。省略中间层确实是一个常见错误,但它不会导致此问题中显示的特定错误。@dave_thompson_085这是否意味着叶证书在不应该设置时设置了“CA:TRUE”?@ShanePowell似乎dave_thompson_085的解决方案解决了此问题,但我希望您能澄清一下。如果我在客户端的主机上安装根证书,然后提供包含所有三个证书的链接文件,s_客户端的检查应该可以吗?因为当我卸载中间证书时,我得到了“验证返回代码:21(无法验证第一个证书)”@GabeL:per-standard SSL/TLS服务器应该发送整个链,除非它可能忽略(非平凡的)根;在您的情况下,它应该至少发送leaf和imed。大多数服务器只发送您配置的内容,但有些服务器会有所不同。如果服务器错误地只发送叶,则标准中没有指定客户端的操作openssl s_客户端
特别是,如果其信任库中同时有root和ime(-CAfile
和/或-CApath
或其默认值),则使用来自信任库的ime