SSL证书链捆绑如何工作?

时间:2013-12-05 20:03:33

标签: ssl openssl certificate ssl-certificate x509certificate

我已经创建了这样的链式层次结构。

root-ca ==> signing-ca ==> subordinate-ca ==> server

提到创建链束,最低应该先行。

$ cat server.crt subordinate-ca.crt signing-ca.crt > server.pem

但验证失败。

$ openssl verify -CAfile root-ca.crt server.pem
error 20 at 0 depth lookup:unable to get local issuer certificate

但是,如果我改变顺序,它似乎有效。

$ cat signing-ca.crt subordinate-ca.crt server.crt > server.pem
$ openssl verify -CAfile root-ca.crt server.pem
server.pem: OK

那么这里的错误是什么?

“猫”之后的链条如下所示。

-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----

更多信息:根据“http://www.herongyang.com/crypto/openssl_verify_2.html”,我执行以下测试。

$ cat signing-ca.crt subordinate-ca.crt > inter.crt
$ openssl verify -CAfile root-ca.crt -untrusted inter.crt server.crt
server.crt: OK

这是否意味着所有链接都很好?

好的,我终于发现这不能通过OpenSSL命令行(或至少很容易)完成。 http://openssl.6102.n7.nabble.com/check-certificate-chain-in-a-pem-file-td43871.html

3 个答案:

答案 0 :(得分:13)

原始订单实际上是倒退。 Certs应该后跟颁发证书,直到最后一个证书由已知根IETF's RFC 5246 Section 7.4.2

发布
  

这是证书的序列(链)。发件人的证书   必须在列表中排在第一位。每个以下证书必须直接   证明它前面的那个。

有关故障排除技巧,另请参阅SSL: error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch

但我仍然不知道为什么他们编写规范以使订单重要。

答案 1 :(得分:1)

current top answer 在多个层面上都是错误的。

首先,它忽略了主要问题,即“验证”does not verify chains of certificates in a single file in this way。证明:

$ cp /etc/ssl/certs/Certigna_Root_CA.pem /tmp/poc.pem
$ echo "unverifiable garbage" >> /tmp/poc.pem
$ openssl verify /tmp/poc.pem 
/tmp/poc.pem: OK

因此,在原始问题中提供的 2 个排序中,只有开头有根证书的排序会报告“OK”,因为该调用只是单独检查根证书,并且系统已经信任它.

关于订购证书的主题,顺序为 specified in the standard(“发件人的证书必须出现在列表中。”)和 nginx 的顺序(“服务器证书必须出现在链接的合并文件中的证书”)相互匹配。这对应于 OP 首次尝试使用 cat

实际正确的答案在email-thread which was linked by the OP中。我会在这里引用:

<块引用>

在命令行上,事情是不必要的困难。

这是您需要做的:

  1. 将链文件拆分为每个证书一个文件,注意顺序

  2. 对于以根目录上方的证书开头的每个证书:

2.1 连接之前的所有证书和根证书 到一个临时文件(此示例用于检查 倒数第三个证书,已经检查了 cert1.pem 和 cert2.pem

Unix:    cat cert2.pem cert1.pem root.pem > cert2-chain.pem
Windows: copy /A cert1.pem+cert1.pem+root.pem cert2-chain.pem /A

2.2 运行此命令

         openssl verify -CAfile cert2-chain.pem cert3.pem

2.3 如果没问题,继续下一个(本例中为 cert4.pem)

因此对于第一轮通过命令将是

Unix: cat root.pem > root-chain.pem Windows:复制/A root.pem root-chain.pem 两者:openssl verify -CAfile root-chain.pem cert1.pem

第二轮是

Unix: cat cert1.pem root.pem > cert1-chain.pem Windows:复制/A cert1.pem+root.pem cert1-chain.pem 两者:openssl verify -CAfile cert1-chain.pem cert2.pem

进一步说明:

  1. 第 1 步(拆分文件)可以像这样自动执行:
csplit -f cert- $file '/-----BEGIN CERTIFICATE-----/' '{*}'
  1. openssl verify 还会从您的系统(例如 /etc/ssl/certs/)获取有关信任的信息,因此如果您真的想确保正确验证您的调用应该类似于 openssl verify -verbose -x509_strict -CAfile upto-cert-02 -CAPath nosuchdir cert-01 (其中 nosuchdir 是不存在的路径,upto-cert-02 是文件 cert-nn 到 certt02 的串联)

答案 2 :(得分:-6)

您需要使用openssl pkcs12 -export -chain -in server.crt -CAfile ...

请参阅https://www.openssl.org/docs/apps/pkcs12.html