SSL はネットワーク処理のプロトコル階層
において
TCP とアプリケーションの間に入る層です。
このように一つの階層(レイヤ)として実現されているので、
様々なアプリケーションに適用できます。
アプリケーションはTCPに直接データを渡すかわりに
SSLを経由してTCPに渡すように変更するだけで済むからです.
inetdを
使っている場合などのように、パイプでリダイレクト
するプログラムからサーバを呼び出すだけで利用できる場合が
多いでしょう.
SSLの通信の手順
公開鍵暗号方式では複雑な計算を行なうために負荷が高いので、
SSLでは共通鍵を交換する時にのみ公開鍵暗号方式を使い、
その後の通信では共通鍵を用います。
通信の手順は以下のとおりです.
- クライアントはサーバーに接続のリクエストを送ります。
- サーバーは自分の署名済みの証明をクライアントに送ります。
ここまでがハンドシェイクと呼ばれます.
- クライアントは受け取った証明書が、信用するCAから
発行されたものかどうかを調べます。
確認できれば次のステップに進みます。
- クライアントは証明書内の情報が、通信を行っている
相手サイトの情報とそのドメイン名やそのサーバの公開鍵の情報と
一致しているか確認します。
この場合、どこまで一致している場合に信頼性が
あると判断するかは設定されたポリシーによります。
- クライアントが仕える通信方式をサーバーに知らせるなどの
ネゴシエーションを行って、利用するセッション鍵(共通鍵方式の鍵,
対象暗号化鍵)を作って,以後の通信を行います.
セッション鍵の作成手順
ではセッション鍵(共通鍵)はどのようにして作るのでしょうか.
これには上の手順をもう少し詳細に見なければなりません。
以下にその詳細部分を説明します.
- クライアントのからサーバへのアクセス要求(Client Hello)
の中には後で使う乱数が含めて送信します。
- サーバからのリプライ(Server Hello)の中にも、
後で使う乱数が含められている
- クライアントではサーバから送られたCA証明書を解読して得られた
サーバの公開鍵を得た後、プリマスタシークレットと呼ばれる乱数を送ります。
このプリマスタシークレットはサーバの公開鍵を使って送られる、
秘密鍵を持つサーバでないと読めないので安全です。
- クライアントとサーバでは、この時点で以下の3つのデータを共有している
- クライアントからアクセス要求時に送られた乱数データ
- アクセス要求対するサーバからのリプライで送られた乱数データ
- プリ・マスタ・シークレット
クライアントとサーバの双方でこれらを用いてセッション鍵を作成します。
この後その共通鍵であるセッション鍵を用いて通信するのです。
ここでの通信内容を他の人は知ることができません。
こうして安全な通信が行うことができるようになります。