クライアント認証は、SSL/TLSネゴシエーションで使用できます。
このため、サーバーが要求した後、クライアントはCertificate Verify Messageを送信します。
証明書検証メッセージには、サーバーによって検証されるクライアント証明書が含まれています。
私の質問は、サーバーがクライアント証明書(クライアントの公開キーを含む)が正当であることをどのように確認するのですか?
サーバーには信頼の根がいくつかあり、それを使用するか、またはアプリケーションに応じて、CAの証明書またはそのクライアントの証明書のみが固定されている場合があります。
とにかく、トラストストアを経由して、クライアント証明書がストア内の何かによって署名されているかどうかを確認するか、固定されている場合は、確認するように構成されている1つのCAまたは証明書と照合するだけです。
TLS 1.3プロトコルのハンドシェイク部分には3つの目標があります。
パート1-証明書の信頼
クライアントはCertificate
メッセージで証明書を送信します。
サーバーは、証明書が信頼できるソースからのものかどうかを判断します。サーバー側の信頼できる証明書のリストまたは信頼できる認証局(CA)から信頼できる証明書が見つかるまで、クライアントの証明書の署名、次に各中間証明書の署名を検証します。
疑似コード:
パート2-クライアントの信頼
クライアントはCertificate Verify
メッセージを送信します。
struct {
SignatureScheme algorithm;
opaque signature<0..2^16-1>;
} CertificateVerify;
signature scheme
は、使用されるハッシュ関数と署名アルゴリズムを示します。
signature
はクライアントによって生成され、サーバーによって検証されます。実際に署名されたデータはクライアントとサーバーで認識されているため、再送信されません(スペース、コンテキスト文字列、ゼロバイト、および以前のメッセージ)。
疑似コード:
ここで、アリスは自分のキーを秘密にしておく必要があり、イブが同じデータと同じ署名でリクエストを再生しないように、データはリクエスト間で異なる必要があります。
理解を深めるのに役立つことを願っています。
参照:
http://www.garykessler.net/library/crypto.html#why
https://tlswg.github.io/tls13-spec/draft-ietf-tls-tls13.html
https://nodejs.org/api/crypto.html#crypto_class_sign
https://www.tutorialspoint.com/cryptography/cryptography_digital_signatures.htm