我已经创建了这样的链式层次结构。
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
答案 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中。我会在这里引用:
<块引用>在命令行上,事情是不必要的困难。
这是您需要做的:
将链文件拆分为每个证书一个文件,注意顺序
对于以根目录上方的证书开头的每个证书:
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
等
进一步说明:
csplit -f cert- $file '/-----BEGIN CERTIFICATE-----/' '{*}'
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 ...