web-dev-qa-db-ja.com

opensslを使用して証明書チェーンのコンポーネントを個別に検証する

これは別の質問に関連しています OpenSSL CLIを使用して別のエンティティによる1つのエンティティの署名を確認する方法

openssl s_client -showcerts -connect www.google.com:443 Googleから3つの証明書を収集します。彼らへ電話します g0g1g2、 どこ:

  • g0は、Googleの中間CAによって署名されたリーフ証明書です
  • g1は中間CA公開鍵を保持し、GeoTrust CAによって署名されています
  • g2はGeoTrust公開鍵を保持し、EquiFax CAによって署名されています

私の目標は、これがOpenSSL CLIを使用して、有効な署名チェーンであることを段階的に示すことです。直感的な試みはこれです:

$ openssl verify -CAfile g1 g0

しかし、OpenSSLは信頼できるストアからの証明書を使用していることがわかります( OpenSSL CLIを使用して別のエンティティによる1つのエンティティの署名を確認する方法 を参照)。したがって、代わりに、上記の質問へのコメントで@ dave_thompson_085が提案したように、信頼できるストアを強制終了します。しかし、これはうまくいかないようです:

$ openssl verify -CApath /dev/null -CAfile g1 g0
g1.crt: C = US, O = Google Inc, CN = Google Internet Authority G2
error 2 at 1 depth lookup:unable to get issuer certificate

では、このverifyコマンドを正しく発行して、g1が署名しましたg0

$ openssl version
OpenSSL 1.0.1f 6 Jan 2014
11
Fixee

私は次のように私の問題を多かれ少なかれ解決しました:

verifyには-partial_chainと呼ばれるオプションがあり、自己署名された信頼されたルート証明書に到達するチェーンを見つけることなく、検証でOKを出力できます。ただし、-partial_chainは、私が使用しているOpenSSLのバージョンにも、それ以降の1.0.1のバージョンにも存在しません。要約は次のとおりです。

  • OpenSSL 1.0.1f-これはUbuntu 14.04の最新版です。ハートブリードの修正があります
  • OpenSSL 1.0.1s-これは1.0.1行の最新版であり、おそらく最後になるでしょう。 Ubuntu 14.04に手動でインストールする必要があります
  • OpenSSL 1.0.2g-現在1.0.2ラインの最新版。これは-partial_chainをサポートします
  • OpenSSL 1.1-これは現在アルファ版であり、さらに多くのオプションがありますが、私は調べていません

したがって、1.0.2g以降では、次のことが可能です。

$ openssl verify -CApath /dev/null -partial_chain -trusted g1 g0
g0: OK
$ openssl verify -CApath /dev/null -partial_chain -trusted g2 g1
g1: OK
$ openssl verify -CApath /dev/null -trusted /etc/ssl/certs/EquiFax_Secure_CA.pem g2
g2: OK

(Equifaxルート証明書は自己署名されているため、最後のコマンドでは-partial_chainは不要でした。)

これは私の質問を満たしますが、手動でインストールしない限り、一部のディストリビューションではまだ利用できないバージョンのOpenSSLが必要です。 1.0.2より前のバージョンに悩まされている場合は、@ Anthony Geogheganの方法を使用する必要があります。

注:verifyドキュメントに-no-CApathと呼ばれるオプションがあり、-CApath /dev/nullの必要性をなくすとされていますが、1.0.2gまたは以前、私のテストに基づいています。 1.1で利用できると思います。

8
Fixee

OpenSSL verifyコマンドは、証明書を検証するために(自己署名CA証明書に到達するまで)完全な証明書チェーンを構築します。そのmanページから:

最初に、提供された証明書から始まりルートCAで終わる証明書チェーンが構築されます。チェーン全体を構築できない場合はエラーになります。

complete chainを検証できる場合にのみ、肯定的な結果を返します。

操作が失敗した場合、証明書は無効です。

ただし、次のコマンドの結果は、g0証明書が署名されているg1証明書。

$ openssl verify -CApath /dev/null -CAfile g1 g0
g1.crt: C = US, O = Google Inc, CN = Google Internet Authority G2
error 2 at 1 depth lookup:unable to get issuer certificate

エラー2は、チェーン内の証明書の1つが見つからなかったことを示します。

2 X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT:発行者証明書を取得できません

検索された証明書の発行者証明書が見つかりませんでした。これは通常、信頼できる証明書のリストが完全でないことを意味します。

ここで重要なことは、depthが1であることです。これは、チェックされている証明書が最初のレベル深さ0g1証明書による)。

g1証明書がnotであった場合、g0証明書、エラーは最初の段階、depth 0となり、代わりにError 2を受け取ります。

error 20 at 0 depth lookup:unable to get local issuer certificate

20 X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:ローカル発行者証明書を取得できません

発行者証明書が見つかりませんでした:これは、信頼されていない証明書の発行者証明書が見つからない場合に発生します。

7

cert1.crtの発行者がcert1Issuer.crtであることを確認するには:

openssl verify -no-CAfile -no-CApath -partial_chain -trusted cert1Issuer.crt cert1.crt
# cert1.crt : OK
0
Marinos An