Client Attacker Server ------ ------- ------ ----------- Handshake -----------> (Attacker hold) <----------- Handshake ----------> <======= Initial Traffic ========> (Renegotiation is triggerd) <-------------------------- Handshake ============================> <======================== Client Traffic ==========================>
(RFC5746の図を改変)
X-ignore: GET /path/ Cookie: hogehoge
(理解の過程のメモなので読む必要なし)
Client certificate authentication
クライアント認証機能を設定できる HTTPS サーバは一般的にディレクトリ毎の設定が可能である.これは,クライアントからのリクエストを受けとるまでは,クライアントが有効な証明書を提出するということを断言できず,サーバが持つ認証ルールでフィルタすることもできない.
クライアント認証が必要である事が分かったリクエストについては,HTTPS サーバはクライアントからクライアント証明書を受け取り,確認を行うために,その時点で TLS チャンネルの再ネゴシエーションを行わなければならない.サーバで有効な証明書が見つかれば,サーバはその時点でリクエストを処理するように強制できる.
不幸なことに,HTTP には新たに認証されたチャンネルないでリクエストを再送信するようにクライアントに求めるための具体的なレスポンスコードが欠如しているため,サーバはオリジナルのリクエストにさかのぼって認証 (authentication) を適用する必要がある.暗号的にはギャップが存在しないにも関わらず(新しい鍵のネゴシエーションは古い鍵の保護の下で行われる),サーバとクライアントの認証の連続性は失われる.(<color gray>ここで言っている「認証 (autentication)」が何の認証なのかがイマイチわからない.例えば HTTP 的にやりとりされている何らかの認証情報 (Cookie でやりとりされているアプリのセッションの情報とか) の事か?</color>)
セッションの回復 (resumption) (<color gray>← SSL/TLS プロトコル上での resumption を指す.Hello メッセージで session_id を指定する</color>) がない限り,最初のクライアントのコネクションから再ネゴシエートしたセッションへ繰り越される重要な暗号の状態は存在しない.テストした HTTPs サーバやクライアントで,再ネゴシエーションの間にセッションの回復の指示が観察できたものはなかった (プロトコルのオプショナル機能なのでそれほど必要とされていない).事実,再ネゴシエーションは新しい暗号化コンテキストを始めるためにデザインされているのに対して,回復 (resumption) は純粋に前の暗号化コンテキストを resume するための最適化のためにデザインされている.その意味では,これらの二つの操作は直行する目的のためにデザインされている.