5

CA1証明書で署名されたクライアント証明書 "A"を取得しています。 CA1証明書は、ルート証明書によって署名されています。信頼できる内部CA証明書を使用してクライアント証明書を検証する方法は?

私はCA1証明書(信頼できる)と受信したクライアント証明書(信頼できません)を持っています。検証中にCA1(信頼できる)のみを使用してクライアント証明書の信頼パスを検証する必要があります。ルート証明書を持っていない/受け取っていません。

この検証は可能ですか?

私はOpenssl 1.0.0gバージョンライブラリを使用しています。誰かがそれを行う方法を知っている場合は、私と共有してください。

+0

役に立つかもしれない:http://stackoverflow.com/questions/13295585/openssl-certificate-verification-on-linux – JSuar

+0

2Balamurugan:申し訳ありません。私は投稿した私の答えに間違っていた。私はそれを削除しました。私は "openssl verify"のパラメータをチェックしました。証明書のチェーン全体が必要なようです。 –

+0

BTW。質問。ルート証明書をオフラインにして、証明書をCA1証明書に割り当てることができない(ベリファイ作業を正常にする)のはなぜですか? CA1証明書にアクセスしてもルート証明書にアクセスできない場合のテストケースは何ですか? –

答えて

2

タグをssl-certificateと指定しているので、Server Certification ValidationまたはClient Cert ValidationのSSL接続中にそのような検証が必要であると仮定します。

これを実現する簡単な方法は、OpenSSL API SSL_CTX_set_verifyを使用して検証コールバックを設定することです。

証明書の検証中にエラーが発生するたびにこのコールバックが呼び出されるため、ルートが見つからなかった場合は、エラーX509_V_ERR_UNABLE_TO_GET_ISSUER_CERTでコールバックされます。あなたはX509_STORE_CTX *へのアクセス権も持っており、ここから証明書の詳細を入手することができます。このメカニズムを使用すると、コードに適切なロジックを実装して、End Entityおよび中間CA証明書が正しいかどうかを確認し、正常であればコールバックから成功を返すことができます。検証に失敗することなく。 OpenSSLのドキュメントから


詳細は:

verify_callback関数はSSL_VERIFY_PEERフラグが設定されている場合の動作を制御するために使用されます。 preverify_okは、問題の証明書の検証が成功したかどうか(preverify_ok = 1)かどうか(preverify_ok = 0)を示します。 x509_ctxは、証明連鎖の検証に使用される完全なコンテキストへのポインタです。

証明書チェーンは、最も深いネストレベル(ルートCA証明書)からチェックされ、ピアの証明書まで上がっています。各レベルで、署名と発行者の属性がチェックされます。検証エラーが見つかるたびに、エラー番号はx509_ctxに格納され、verify_callbackはpreverify_ok = 0で呼び出されます。 X509_CTX_store_ *関数を適用することによって、verify_callbackは問題の証明書を探し出し、追加の手順を実行できます(使用例を参照)。証明書にエラーが見つからない場合、次のレベルに進む前にpreverify_ok = 1でverify_callbackが呼び出されます。

verify_callbackの戻り値は、さらなる検証プロセスの戦略を制御します。 verify_callbackが0を返すと、検証処理は ``検証に失敗しました ''の状態で直ちに停止します。 SSL_VERIFY_PEERが設定されている場合、検証失敗アラートがピアに送信され、TLS/SSLハンドシェイクが終了します。 verify_callbackが1を返すと、検証プロセスは続行されます。 verify_callbackが常に1を返すと、TLS/SSLハンドシェイクは検証失敗に対して終了せず、接続が確立されます。ただし、呼び出しプロセスは、SSL_get_verify_result(3)を使用するか、verify_callbackによって管理される独自のエラーストレージを維持することによって、最後の検証エラーのエラーコードを取得できます。

verify_callbackが指定されていない場合、デフォルトのコールバックが使用されます。その戻り値はpreverify_okと同じです。したがって、SSL_VERIFY_PEERが設定されていると、検証に失敗するとアラートメッセージでTLS/SSLハンドシェークが終了します。

関連する問題