SSL(Secure Socket Layer)って?
通信時のセキュリティ担保のための技術で、通信時に使われている(ブラウザに出てくる鍵マークとか)ってことはわかるんだけど、実際どんな技術を使っているのかイマイチ理解出来ない。
ってことでいろいろ調べた結果を以下にまとめてみました。
参考:
SSLのプロセスざっくり
まず認証のプロセスとして、安全を保つために大きく2つのプロセスに分かれてます。
(1)ネゴシエーション
接続相手を認識して、通信に必要な共通鍵を作成するプロセス。
(2)暗号化通信
作成した共通鍵で通信するプロセス。
※公開鍵認証 / 共通鍵認証については、時間があったら。
知らないひとはQiiてね。
細かいプロセス
(1)ネゴシエーション
ネゴシエーションって交渉とか折衝とかいう意味。
まず、通信開始する前に、サーバ、クライアントが
「全く同じ共通鍵を作ってデータ通信したい。
でも直接共通鍵渡すとパクられたりしそうでちょっと怖い」
を解決するためにちょっと面倒な手順を踏む。
公開鍵/秘密鍵の暗号/複合を使って確認する。
a)接続要求 [クライアント → サーバ]
倉:「おーい、SSL通信したいんだけどOK?」
鯖:「ちょいまちー」
b)返答:公開鍵(サーバ証明書)の送付[サーバ → クライアント]
鯖:「通信暗号化するための公開鍵送るんで受け取ってー。」
倉:「おK。待ってる・・・公開鍵キタコレ」
※共通鍵作成のための公開鍵を、サーバからクライアントに渡す(同じ公開鍵を持つ)
c)通信用データ作成、送付 [クライアント → サーバ]
倉:「したら通信用のデータ作っておくるわー。暗号化してくれる?」
鯖:「まかせろー」
※通信用公開鍵作成のためのデータをクライアントからサーバに渡す(同じデータを持つ)
d)暗号化通信用鍵作成 [クライアント & サーバ]
鯖:「そしたらもらったデータ暗号化して共通鍵作るわー(作った)」
倉:「おけおけ。こっちも作る(出来た)」
※同じ公開鍵で同じデータを暗号化することで、サーバとクライアントが同じ共通鍵を持つ。
重要なのは「サーバ側が持つ公開鍵」と「クライアントがつくるデータ」を掛けあわせて共通鍵を作ること。
通信でやりとりをするのはこの2つ。
これで、直接(メールとかで)共通鍵を渡すことなく
全く同じ共通鍵をクライアントとサーバが持つことになる。
(2)暗号化通信
作成した共通鍵を使ってデータのやりとりをする。
a)データ送信 [クライアント → サーバ」
倉:「データ暗号化しておくるよー。(共通鍵を使って暗号化)」
鯖:「ばっちこーい。」
b)データ受信「サーバ」
鯖:「届いたー、復号すんね(共通鍵を使って復号)」
倉:「りょ。つづけておくるよー(エンドレス)」
負荷の高い公開鍵/秘密鍵暗号化を、相互の認証(共通鍵作成)のために使い、
その後は負荷の小さい共通鍵を使う、というSSLの仕組みでした。