Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ssl 在叶证书上验证证书链失败_Ssl_Openssl_Ssl Certificate_Pyopenssl - Fatal编程技术网

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),我想确认我正确定义了所有内容

以下是我采取的步骤:

  • 我制作了三个PEM证书,对CA进行了自签名,并定义了基本约束
    crypto.X509Extension(b'basicConstraints',False,b'CA:TRUE')
    如下
  • 我将CA和中间证书复制到
    /usr/local/share/CA证书
    (作为crt文件)并运行
    sudo更新CA证书
  • 我已经建立了一个基于
  • 我尝试使用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