これは別の質問に関連しています OpenSSL CLIを使用して別のエンティティによる1つのエンティティの署名を確認する方法
openssl s_client -showcerts -connect www.google.com:443
Googleから3つの証明書を収集します。彼らへ電話します g0
、g1
、g2
、 どこ:
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
私は次のように私の問題を多かれ少なかれ解決しました:
verify
には-partial_chain
と呼ばれるオプションがあり、自己署名された信頼されたルート証明書に到達するチェーンを見つけることなく、検証でOK
を出力できます。ただし、-partial_chain
は、私が使用しているOpenSSLのバージョンにも、それ以降の1.0.1のバージョンにも存在しません。要約は次のとおりです。
-partial_chain
をサポートしますしたがって、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で利用できると思います。
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であることです。これは、チェックされている証明書が最初のレベル深さ0(g1証明書による)。
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:ローカル発行者証明書を取得できません
発行者証明書が見つかりませんでした:これは、信頼されていない証明書の発行者証明書が見つからない場合に発生します。
cert1.crt
の発行者がcert1Issuer.crt
であることを確認するには:
openssl verify -no-CAfile -no-CApath -partial_chain -trusted cert1Issuer.crt cert1.crt
# cert1.crt : OK