web-dev-qa-db-ja.com

クライアントはServerHelloの後にクライアント証明書と共にCAチェーンを送信する必要がありますか?

MTLSハンドシェイク中に、ServerHelloが完了した後、クライアントはクライアント証明書をサーバーに送り返します。クライアントがクライアント証明書のみを送信する必要があるのか​​、それともCAチェーン全体と共にクライアント証明書を送信する必要があるのか​​を知る必要がありますか?

CertificateVerifyの後にハンドシェイクの失敗が発生する状況があります。クライアント証明書は正常に見え、サーバーが信頼するRootCAからサインアウトされたサブCAからサインアウトされています(サーバーはルートCAのみを信頼し、サブCAは信頼しません)。チェーン、それが私がハンドシェイクの失敗を見る理由ですか?クライアントがCAチェーン全体を送り返したかどうか、サーバーはクライアントがSubCAによって署名されていることを知っているはずです。SubCAは次に、信頼するルートCAによって署名されます...サーバーの送信に関する多くの情報をググって見つけましたCAチェーンとクライアントへの受け入れ可能なCAを使用して証明書を発行します。

どんな助けでもありがたいです。

6
Waazu14

サーバーが証明書を信頼されたルートに接続するのに十分な数のチェーンを送信する必要があります。

TLS 1.2の場合、これは RFC 5246 で説明されています。クライアント証明書は §7.4.6 で定義されています。

クライアント証明書は、セクション7.4.2で定義された証明書構造を使用して送信されます。

そして §7.4.2 を見ると、certificate_listを含む証明書構造が記述されています(鉱山を強調):

これは証明書のシーケンス(チェーン)です。送信者の証明書はリストの最初に来る必要があります。 次の各証明書は、その前の証明書を直接証明する必要があります。証明書の検証では、ルートキーを個別に配布する必要があるため、ルート認証局は、リモートエンドがそれを検証するためにすでにそれを所有している必要があると仮定して、チェーンから省略される場合があります(-===-)。

つまり、サーバーは信頼されたルートを持つことが期待されますが、必須ではないか、または必要となる可能性のある中間証明書を持つことが期待されます。検証を円滑かつ確実に進めるためには、クライアントがそれらを提供する必要があります。 (サーバーがクライアントに送信する証明書についても同様です)。

11
gowenfawr

クライアント証明書を検証するサーバーは、サーバーの証明書を検証するクライアントとまったく同じですが、サーバーは通常、単一のルートCAしか信頼せず、サーバーは通常、不足している中間証明書をダウンロードすることを望まない(ブラウザーが行うもの)。

クライアント証明書を検証するサーバーは、サーバーが信頼する証明書(おそらくルートCA)からエンドエンティティ証明書へのチェーンを構築できる必要があります。これに中間物が必要な場合は、中間物を提供するか、中間物を実際のルートに加えて、サーバー上の信頼されたルートとして構成する必要があります。

1
Z.T.