Open koheiyamayama opened 4 years ago
2章
TLSとは「上位層の通信プロトコルが何であるかによらず、接続指向のネットワーク通信を安全にするために設計された暗号化プロトコル」である。
Recordプロトコル
TLSを大まかに捉えるとRecordプロトコルによって実現されている。このプロトコルがコネクション上でやり取りされる低レベルのメッセージの転送を担う。
Recordプロトコルは以下の構成になっている。
Recordプロトコルは具体的に以下の役割を持つ。
TLSのメインの仕様では以下4つのサブプロトコルが規定されている。
Handshakeプロトコル
Handshakeプロトコルでは、二点間通信の両サイドはTLS接続で使うパラメータのネゴシエーションと認証をHandshakeプロトコルで行う。
どのようなやり取りになるのかは設定と対応している拡張の種類によって様々に変わる。実用上は以下を抑えておけば問題ない。
Handshakeプロトコルのメッセージの先頭にはヘッダが付く。このヘッダーでメッセージの種類とメッセージの長さを表現する。あと、メッセージ。具体的には以下の構成になっている。
struct {
HandshakeType msg_type;
uint24 length;
HandshakeMessage message;
} Handshake;
フルハンドシェイク
クライアント認証
セッションリザンプション
鍵交換
鍵交換の目的は プリマスターシークレットという値を生成すること にある。
そもそも鍵交換とは「安全ではない通信路を使って2つの参加者が安全に鍵を交換する方法」のことである。参考
TLSでは色々な鍵交換アルゴリズムを使うことができる。ネゴシエーションの結果、どのアルゴリズムを使うか決まった後に ServerKeyExchange メッセージをサーバがクライアントに送る。ここではアルゴリズムに必要なメタデータを送信する。アルゴリズムによってはメタデータが必要ない場合がある。
認証
TLSでは高コストな処理である暗号処理を何度もしないように、認証と鍵交換が一体となっている。
実際にどうやって一体となっているのかは鍵交換アルゴリズムによって異なる。
暗号化
TLSではアプリケーションデータを様々なアルゴリズムで暗号化できる。
TLSで使用できる暗号化アルゴリズムは以下の3つに分類できる。
再ネゴシエーション
Application Dataプロトコル
アプリケーションのデータを運ぶのがAppliction Dataプロトコルである。ApplicationDataプロトコルはTLSおいては単なるデータのバッファとして機能する。アプリケーションのデータはセキュリティパラメータに従って、Recordプロトコルのレイヤでパッケージ化、細分化、および暗号化される。
Alertプロトコル
通信中の相手に例外的な状況を伝える関係な通知の仕組みがAlertプロトコルである。
接続を閉じる
通信の主体者が意図的に接続を切る方法が必要である。なぜなら、強制切断攻撃を防ぐためである。強制切断攻撃をされると、それ以降のデータが送られなくなる。なので、意図的に接続を閉じるための方法がないと、通信が正常に終了したのか、それとも強制切断攻撃を受けたのかが分からない。
暗号処理
疑似乱数生成器
マスターシークレット
接続鍵の生成
暗号スイート
拡張
色々な拡張がある。
プロトコルの限界
TLSで全ての通信が暗号化されるわけではない。
プロトコルのバージョン
拡張はそれぞれ一意の識別子オブジェクト、拡張子の重要度、それに値で構成される。重要度がcriticalと設定されている拡張は必ず認識され正しく処理されなかればならない。そうならない場合は証明書ごと破棄しなければならない。
Subject Alternative Name Subject Alternative Name(SAN)拡張は、Subject フィールドに代わって、DNS 名や IP アドレスや URI によって示される複数の主体を公開鍵に結び付けられるようになっている。
Name Constrains Name Constraints 拡張は、CA が証明書を発行できる主体に制約を課すために使います。 主体を表す名前空間を明示して除外したり、許可したりできるのです。この便利な拡張によ り、たとえば、自分で所有しているドメイン名に対してのみ証明書を発行できる下位の CA を企業などが持てるようになります。
Basic Constrains よくわからん。 CA 証明書であることを示すため、および、下位 CA の証明書パスの深さを制御するために使う拡張です。証明書パスの深さは、入れ子になった CA 証明書を発行できるかどうかと、 その入れ子の深さを意味し、この拡張の path length constraint フィールド( pathlen ) を使って示します。
Key Usage 証明書に含まれる鍵の用途を規定します。鍵の用途は限られており、 個々の証明書にはそのいずれかを設定できます。たとえば、CA 証明書であれば Certificate Signer(署名の検証用)および CRL Signer(CRL の署名の検証用)の各ビットを設定するこ とになります。
Extended Key Usage 公開鍵の用途をさらに柔軟に決定したり制限したりできるように、任意の用途を追加で指定できるようにするのが EKU(Extended Key Usage、鍵拡張用途)拡張です。
Certificate Policies よくわからない。
CRL Distribution Points CRL(Certificate Revocation List、証明書失効リスト)の場所を示すのに使われる拡張です。CRL の場所は、通常は LDAP や HTTP の URI で示されます。
Authority Information Access 証明書を発行している CA が提供する付加的な情報やサービスへのアクセス方法を示すための拡張が AIA(Authority Information Access)です。そのような情報の例としては、 OCSP レスポンダの場所(HTTP スキームの URI)が挙げられます。証明書利用者は OCSP レ スポンダを使って失効情報をリアルタイムに確認できます。
Subject Key Identifier この拡張には、特定の公開鍵を含む証明書を識別するために利用可能な一意の値が含まれます。識別子は公開鍵そのものから(ハッシュ化などで)導出したものとすることが推奨さ れています。CA 証明書はすべてこの拡張を含んでいなければならず、その値は発行済みの すべての証明書のAuthority Key Identifier拡張に含まれる識別子と同じでなければなりま せん。
Authority Key Identifier よくわからん
3日掛かった。19ページ分。