【プロトコル】SSL / TLS ~知識編~

SSL / TLS

SSL(Secure Socket Layer)

 * ネット上で情報を暗号化して送受信できる仕組み

TLS(Transport Layer Security)

 * SSLをベースとした標準化した暗号通信プロトコル。RFC2246として規格化されている。
 * 以下の表を見る限り、SSLより優れてる?
http://qiita.com/kuni-nakaji/items/5118b23bf2ea44fed96e

目的

 1) データの暗号化
 2) 通信相手が信頼できるか確認(認証)

位置付け

 * アプリケーションとTCPの間に位置し、データの暗号化と復号を行う

階層

 +---------------------------------------+
 |         SSLを使ったHTTP             |
 +---------------------------------------+
 |                 HTTP                  | ← アプリケーション層
 +---------------------------------------+
 |                 SSL                   |
 +---------------------------------------+
 |                 TCP                   | ← トランスポート層
 +---------------------------------------+
 |                  IP                   | ← インターネット層
 +---------------------------------------+

暗号化概要

 * 「公開鍵暗号」と「共通鍵暗号」という暗号方式を組み合わせて利用 << ★非常に重要★
    (以下のサイトが非常にわかりやすい)
http://itpro.nikkeibp.co.jp/article/COLUMN/20071012/284424/?ST=selfup
  => 「公開鍵暗号」で、サーバ-クライアント間の暗号通信に使う共通鍵を暗号化し、サーバに送る
  => 以降は、「共通鍵暗号」で、やり取りする
やり取りの流れ
 (1) 受信者(鍵作成者)は「秘密鍵」と「公開鍵」をペアで作成
 (2) 「公開鍵」の方を公開し、「秘密鍵」は自分で保管
 (3) 送信者は、受信者の公開鍵を入手し、その鍵を使って暗号化を行う
  ※Point! 暗号化された文書は、 公開鍵では元に戻せない
 (4) 受信者は、保管しておいた秘密鍵を使って復号

公開鍵暗号

 * 公開鍵暗号は、公開鍵と秘密鍵と呼ばれるペアの鍵を使う方式
  => 片方の鍵で暗号化したデータは、ペアとなっているもう片方の鍵でしか復号できない
  => 片方の鍵をインターネットで公開しても、もう片方の鍵を秘密にしておけば、
     目的の相手(公開鍵のペアとなっている秘密鍵を持つ相手)だけに安全にデータを送れる
  => 公開鍵で暗号化したデータは、ペアとなっている秘密鍵でしか暗号化・複合化できない

共通鍵暗号

 * 暗号化と復号化に同じ鍵(共通鍵)を使う方式

【欠点】
[前提条件]
送信側と受信側の両者が、あらかじめ誰にも知られていない同じ鍵を持っていなければいけない

 * 鍵をそのままインターネットで送ると、肝心の鍵が他人に盗まれる恐れがある
  => あらかじめ通信相手を特定していないインターネットの通信で、両者が通信前に同じ鍵を持つことは不可能

SSL概要

 [1] クライアント側からサーバ側に対して、SSLによる接続を要求する
   その際、暗号通信で使う暗号方式などを提案する(ClientHelloメッセージ)
 [2] 提案のあった暗号通信方式から適切なものを選んでクライアント側に送信する(ServerHelloメッセージ)
 [3] Webサーバ側は、認証局(CA)から発行されたサーバ証明書に公開鍵を添付して
   クライアント側に送信する(Certificateメッセージ)
 [4] 証明書の情報を送り終えたら、そのことをクライアント側に知らせる(ServerHelloDoneメッセージ)
 [5] サーバ証明書を受け取ったクライアントは、サーバ証明書が有効であるかどうかを
   確かめるために、サーバ証明書に記載されている認証局にアクセスして
   認証局の公開鍵を取得する
 [6] 実際のデータを暗号化するための共通鍵を作成する
 [7] 先に複合化した公開鍵おで共通鍵を暗号化する(ClientKeyExchangeメッセージ)
 [8] 暗号化した共通鍵をWebサーバ側に送信する
 [9] 自分自身の公開鍵で暗号化された共通鍵を受け取ったサーバ側は、
   自分の秘密鍵で複合化して共通鍵を取り出す
 [10] 以後、共通鍵を使用してお互い暗号化と複合化を行い、安全な通信を行う

SSL概要図

* 本当はもっと細かいが概要を掴むための図
              Client                                      Server
                 |                                          |
 [1]             |  httpsでサーバに対してリクエストを出す   |
                 |   (SSL通信をしたいとサーバに要求する)    |
                 |  暗号通信で使う暗号方式などを提案する    |
                 |----------------------------------------->|
                 |                                          |
                 | 提案のあった暗号方式か一つ選んで返答する |
                 |<-----------------------------------------| [2]
                 |                                          |
                 |          サーバ証明書を送信する          |
                 |   (SSL通信をしたいとサーバに要求する)    |
                 |<-----------------------------------------| [3]
                 |                                          |
                 |      証明書情報を送り終えたと知らせる    |
                 |<-----------------------------------------| [4]
                 |                                          |
 [5] 認証局(CA)に        |                                          |
     ルート署名を確認   |                                          |
                 |                                          |
 [6] 共通鍵を生成する   |                                          |
                 |                                          |
 [7]             |    共通鍵をサーバの公開鍵で暗号化送信    |
                 |   (SSL通信をしたいとサーバに要求する)    |
                 |----------------------------------------->|
                 |                                          |
                 |                                          | [8] 暗号化された共通鍵を
                 |                                          |     自分の秘密鍵で復号化する
 [9]             |      暗号化通信を開始する旨を宣言        |
                 |----------------------------------------->|
                 |                                          |
                 |      暗号化通信を開始する旨を応答        |
                 |<-----------------------------------------| [10]
                 |                                          |
 以降、暗号化通信を行う。

詳細は以下のサイトを参照のこと。
http://thinkit.co.jp/cert/article/0706/3/6/3.htm

サーバー証明書の発行の手順

 [1] CSR(Certificate Signing Request / 証明書署名要求)の生成
 [2] サーバ証明書の発行
   => 認証局(CA)がCSRに認証署名を入れ、サーバー証明書を発行