TLSについて

日時:

むかしTLS1.3について調べたときにまとめたもの.

TLSについて.

続いてそれに関わってくる公開鍵基盤(PKI)について.

DV証明書

DV証明書を始め,アクセスしているサイトのサーバ証明書は大抵のブラウザからだと鍵マークをクリックすれば見られる.

TLS1.3の概要

フルハンドシェイクというサーバと初めて通信する際に行われるものの基本的な流れについて.

(参考)RFC8446 2. Protocol OverviewのFigure 1を引用.

       Client                                           Server

Key  ^ ClientHello
Exch | + key_share*
     | + signature_algorithms*
     | + psk_key_exchange_modes*
     v + pre_shared_key*       -------->
                                                  ServerHello  ^ Key
                                                 + key_share*  | Exch
                                            + pre_shared_key*  v
                                        {EncryptedExtensions}  ^  Server
                                        {CertificateRequest*}  v  Params
                                               {Certificate*}  ^
                                         {CertificateVerify*}  | Auth
                                                   {Finished}  v
                               <--------  [Application Data*]
     ^ {Certificate*}
Auth | {CertificateVerify*}
     v {Finished}              -------->
       [Application Data]      <------->  [Application Data]

              +  Indicates noteworthy extensions sent in the
                 previously noted message.

              *  Indicates optional or situation-dependent
                 messages/extensions that are not always sent.

              {} Indicates messages protected using keys
                 derived from a [sender]_handshake_traffic_secret.

              [] Indicates messages protected using keys
                 derived from [sender]_application_traffic_secret_N.

               Figure 1: Message Flow for Full TLS Handshake

要点(というより自分の感想)

主にやる三つのこと

ClientHelloメッセージ

クライアントが初めて接続するサーバに対して最初に必ず送るメッセージ.以下の情報を含む(重要なものだけ).

ServerHelloメッセージ

サーバがClientHelloメッセージを受信し,クライアントに指定された方式のどれかに基づいて通信が可能だと判断した場合,クライアント側にServerHelloメッセージを返す.以下の情報を含む(重要なものだけ).

ServerHelloを送った後,ClientHelloからServerHelloまでのハンドシェイクメッセージ全体とClientHelloで得た情報を用いて作られるserver_handshake_traffic_secretから導出された鍵を用いてサーバからのメッセージは暗号化される.

ServerHelloを受け取った後のクライアント側も同様.ただし,client_handshake_traffic_secretはserver_handshake_traffic_secretとは値が異なる.

EncryptedExtensionsメッセージ

サーバがServerHelloメッセージを送った後すぐクライアントに送るメッセージ.暗号パラメータの決定には関係ないが,証明書に付随していない情報を送る.

CertificateRequestメッセージ

サーバがクライアント認証を求める場合,クライアント側に送るメッセージ.求めない場合は省略される.

Certificateメッセージ

クライアントまたはサーバ側が認証のための証明書を送るメッセージ.サーバ側が証明書によって認証されていない場合や,サーバがCertificateRequestを送らなかった場合は,それぞれサーバ側,クライアント側でのこのメッセージは省略される.証明書が中間認証局によって署名されている場合は,その中間認証局群の一連の証明書も含めて送る.

CertificateVerifyメッセージ

CertificateVerifyメッセージ前までのハンドシェイクメッセージ全体を用いて作られるデータに秘密鍵を用いて署名し,相手に送る.受け取った側は,Certificateメッセージに含まれる証明書の正しさを所持している認証局の証明書を用いて確認し,格納された公開鍵を用いて,CertificateVerifyメッセージでの署名を検証する.

Finishedメッセージ

一連の手続きが成功したかどうかの検証データを送る.送られた側はそれを検証する.検証が上手くいかなかった場合は接続を切る.

鍵導出

server_handshake_traffic_secretのときと同様,サーバ側から送るアプリケーションデータを暗号化するアルゴリズムで必要な鍵と初期値IV(アルゴリズムの中で必要になる値)はClientHelloからサーバのFinishedまでのハンドシェイクメッセージ全体を用いて作られる.クライアント側も同様.クライアント側からの送信で用いる鍵と初期値IVはサーバ側のそれとは値が異なる.

TLS1.3では暗号化アルゴリズムに,暗号化のみならずメッセージの改ざん検知の機能も持っているAEAD方式が取られており,メッセージの完全性も確保できる.