SSL/TSLのセッション及びコネクション接続のやり取りの日常。

SSL/TLSにおけるセッション及びコネクションの確立に関するクライアントさんとサーバーさんのやりとり。
こんな感じで日々コミュニケーションスタート。

この記事を書いたきっかけ

SSL/TSLのコネクションを開始するまでにやりとりがたくさんあってつかみづらかったので、擬人化してストーリー仕立てにしてみました。
各セリフの後のカッコ内の解説は、後述の通り上原孝之氏の著書より引用しています。

登場人物

 クライアントさん   サーバーさん
f:id:Tiratom:20180630001122p:plain f:id:Tiratom:20180630001107p:plain

ある日の会話

f:id:Tiratom:20180630001122p:plain
「Hello!クライアントだよ!あなたとお話ししたいんだけど、aモード,bモード,cモードetcどれがいい??」
(Client Hello:「クライアントが利用可能な暗号化/圧縮アルゴリズムの一覧をサーバに送付」する)

f:id:Tiratom:20180630001107p:plain
「Hello!サーバーだよ!そしたらこのモードでお話ししよう!」
(Server Hello:クライアントが送付したアルゴリズムの中からサーバが「実際に使用する暗号化/圧縮アルゴリズムをサーバが決定し、クライアントン通知する」)

f:id:Tiratom:20180630001107p:plain
「あっ、お名刺お名刺・・・わたくしこういうものでして」
(Certificate:「サーバのディジタル証明書(公開鍵証明書)」「をクライアントに送信する」)

f:id:Tiratom:20180630001107p:plain
「よろしければお名刺ちょうだいできますか??」
(Certificate Request:「サーバがクライアントに対し、ディジタル証明書の提示を要求する」)

f:id:Tiratom:20180630001107p:plain
「あっ、すみません私ついついしゃべりすぎちゃって」
(Server Hello Done:「サーバがクライアントに対して、Server Helloからの一連のメッセージが完了したことを送信する」)
f:id:Tiratom:20180630001122p:plain
「ご挨拶が遅れました お名刺どうぞ わたくしこういうものでして」
(Certificate:「クライアントのディジタル証明書(公開鍵証明書)を」「サーバに送信する」)
f:id:Tiratom:20180630001122p:plain
「そうだ、私たち二人だけの合言葉作っちゃいました。あなたの鍵付きポストに入れてます」
(Client Key Exchange:「暗号化通信に使用するセッション鍵を生成するもととなる情報(プリマスタシークレット)をクライアントが生成し、ディジタル証明書に含まれるサーバの公開鍵で暗号化してサーバに送信する」)
f:id:Tiratom:20180630001122p:plain
「私たちの今までの思い出をちょっと議事録にまとめてみました。私の署名入りです。ご査収ください。」
(Certificate Verify:「クライアントはClient Helloから直前までの通信内容のダイジェスト(ハッシュ値)に自身の秘密鍵を用いてディジタル署名(Certificate Verify)を作成し、サーバに送信する。」サーバはデジタル署名を検証し、クライアント認証を行える。)

f:id:Tiratom:20180630001122p:plain
「ふふふ・・・この二人だけの合言葉、ちょっとこの呪文と掛け合わせてあげることで完全な魔法の詠唱文になるのよね~。そしてこの魔法を詠唱すると、鍵が生成されるのよ・・・!サーバーさん!私はいつでも連絡待ってるよ~!」
(Change Cipher Spec:クライアントは、サーバに渡したのと同じ「プリマスタシークレットと、サーバ及びクライアントがそれぞれ生成した乱数からマスターシークレットを作成する。続いて、Recordプロトコルが、」マスターシークレットから「MAC鍵、暗号鍵、ブロック暗号のCBCモードで使用する初期ベクトル(IV)を生成する。」その後、「Change CIper Specプロトコルが、使用する暗号アルゴリズムの準備が整ったことをサーバに通知する」)

f:id:Tiratom:20180630001122p:plain
「サーバさん!あなたと私はお友達よ~!」
(Finished:「鍵交換と認証処理が成功したことをサーバに通知する。」先ほど生成した鍵で「メッセージを暗号化して送信する。」)

f:id:Tiratom:20180630001107p:plain
「この合言葉、なんか物足りないな・・・。この呪文を掛け合わせたほうがかっこいいな・・・なにっ、図らずも魔法の詠唱をしてしまったようだ!魔法陣から鍵がいくつか生成されたぞ・・・!クライアントさん、確かに受け取ったぜ!」
(Change Ciper Spec:「サーバは、クライアントから受信した暗号化されたプリマスタシークレットを、自身の秘密鍵を用いて復号し、それと乱数を用いてクライアントと同様にマスターシークレットを生成する。続いてRecordプロトコルが、」マスターシークレットからMAC鍵、暗号鍵、初期ベクトルを生成する。その後、「Change Ciper Specプロトコルが、使用する暗号アルゴリズムの準備が整ったことをクライアントに通知する」)

f:id:Tiratom:20180630001107p:plain
「うん!!ずっ友!!」
(Finished:「鍵交換と認証処理が成功したことをクライアントに通知する。」先ほどの鍵を使用してメッセージを暗号化する。「これによってSSL/TLSのセッション及びコネクションが確立さし、以降はアプリケーションによる暗号化通信が行われる。」)

参考資料・引用

上原孝之著 うかる!情報処理安全確保支援士 2018年度版 2017年 翔泳社 第7章 情報セキュリティ対策技術(3)暗号 7.4 SSL/TLS