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

■ はじめに

SSL / TLS について扱う

目次

【1】SSL / TLS
【2】目的
【3】位置付け
【4】暗号化
 1)公開鍵暗号
 2)共通鍵暗号
【5】SSL概要
 1)概要図

【1】SSL / TLS

SSL(Secure Socket Layer)

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

TLS(Transport Layer Security)

* SSLをベースとした標準化した暗号通信プロトコル。
 RFC2246として規格化されている。
* 以下の表を見る限り、SSLより優れてる?

http://qiita.com/kuni-nakaji/items/5118b23bf2ea44fed96e

【2】目的

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

【3】位置付け

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

階層

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

【4】暗号化

* 「公開鍵暗号」と「共通鍵暗号」という暗号方式を
 組み合わせて利用 << ★非常に重要★
    (以下のサイトが非常にわかりやすい)

http://itpro.nikkeibp.co.jp/article/COLUMN/20071012/284424/?ST=selfup

=> 「公開鍵暗号」で、サーバ-クライアント間の暗号通信に使う
  共通鍵を暗号化し、サーバに送る
=> 以降は、「共通鍵暗号」で、やり取りする

やり取りの流れ

[1] 受信者(鍵作成者)は「秘密鍵」と「公開鍵」をペアで作成
[2] 「公開鍵」の方を公開し、「秘密鍵」は自分で保管
[3] 送信者は、受信者の公開鍵を入手し、その鍵を使って暗号化を行う
  ※Point! 暗号化された文書は、 公開鍵では元に戻せない
[4] 受信者は、保管しておいた秘密鍵を使って復号

1)公開鍵暗号

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

2)共通鍵暗号

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

欠点

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

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

【5】SSL概要

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

1)概要図

* 本当はもっと細かいが概要を掴むための図

              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に認証署名を入れ、サーバー証明書を発行

参考文献

http://www.inboundmarketing.jp/blog/2012/04/12/ssl/
http://thinkit.co.jp/free/article/0706/3/6/
公開鍵暗号方式 / 秘密鍵暗号方式
http://dev.sbins.co.jp/cryptography/cryptography02.html
http://www.infonet.co.jp/ueyama/ip/glossary/public_key.html
シリーズもの
http://itpro.nikkeibp.co.jp/article/COLUMN/20071012/284384/?ST=selfup

Lesson1
 * SSLの機能と位置付け
 * SSLを使うと何ができるのか
 * 通信の流れのどの部分でSSLが使われているのか

http://itpro.nikkeibp.co.jp/article/COLUMN/20071012/284425/?ST=selfup

Lesson2
 * SSLの概要

http://itpro.nikkeibp.co.jp/article/COLUMN/20071012/284424/?ST=selfup

Lesson3
 * SSLのやりとりの様子とメッセージの内容を確認

http://itpro.nikkeibp.co.jp/article/COLUMN/20071012/284445/?ST=selfup

Lesson4
 * 証明書とは?
 * 証明書を使った通信相手が信頼できるか検証するしくみ

http://itpro.nikkeibp.co.jp/article/COLUMN/20071012/284426/?ST=selfup

Active Directory証明書サービスでセキュアな公開鍵基盤を構築する

http://www.atmarkit.co.jp/ait/articles/1508/28/news021.html
http://www.atmarkit.co.jp/ait/articles/1509/17/news016.html
http://www.atmarkit.co.jp/ait/articles/1512/01/news025.html

関連記事

SSL / TLS ~ 関連用語・拡張子編 ~
https://dk521123.hatenablog.com/entry/2014/02/27/000100
SSL / TLS脆弱性編 ~
https://dk521123.hatenablog.com/entry/2016/03/09/205813