このようなチェーン階層を作成しました。
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
では、ここでのエラーは何でしょうか?
「cat」の後のチェーンは次のようになります。
-----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
それはすべてのリンクが良好であることを意味しますか?
OK、私はついにこれがOpenSSLコマンドラインを介して(または少なくとも簡単に)実行できないことを発見しました。 http://openssl.6102.n7.nabble.com/check-certificate-chain-in-a-pem-file-td43871.html
元の順序は実際には逆順です。 IETFのRFC 5246セクション7.4.2 ごとに、既知のルートによって最後の証明書が発行されるまで、証明書は後に続く発行証明書である必要があります
これは証明書のシーケンス(チェーン)です。送信者の証明書はリストの最初に来なければなりません。次の各証明書は、その前の証明書を直接認証する必要があります。
トラブルシューティングのテクニックについては、 SSL:error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch も参照してください。
しかし、なぜ順序が重要になるように仕様を書いたのかはまだわかりません。