SSL/TLSについて

SSL/TLSについて、何度学んでも理解できないので自分の頭の中をまとめてみる。

  • まずは基本的な事として、セキュリティに対する脅威と暗号技術による防御
    • 盗聴
      • 機密性が脅かされる。対策として対称暗号、公開鍵暗号
    • 改ざん
      • 正真性が脅かさる。対策として一向性ハッシュ
    • なりすまし
      • 認証が脅かされる。対策としてメッセージ認証コード
    • 否認
      • 否認不可能性が脅かされる。対策としてデジタル署名
  • デジタル署名
    • メッセージをサーバー公開鍵、送信者を証明局、受信者をクライアントと置き換えれば良い。
      1. 送信者は一向性ハッシュでメッセージのハッシュ値を計算する
      2. 送信者はプライベート鍵でハッシュ値を暗号化する。これが署名になる。
      3. 送信者はメッセージと署名を送信する。
      4. 受信者は受信した署名を送信者の公開鍵で複合化する。
      5. 受信者は受信した署名から得られたハッシュ値と、送信者から受信したメッセージのハッシュ値を比較する
  • 証明書とは?フローをみてみる。
    • メッセージ受信者をA、送信者をBとする。
      1. Aが鍵ペアを作成する。
      2. Aは証明局に自分の公開鍵を登録する。
      3. 証明局はAの公開鍵に自局のプライベート鍵でデジタル署名をして証明書を作成する。
      4. Bは証明局のデジタル署名がついたAの公開鍵(証明書)を入手する。
      5. Bは証明局の公開鍵を使ってデジタル署名を検証し、Aの公開鍵が正しい事を確認する。
      6. BはAの公開鍵でメッセージを暗号化し、Aへ送信する。
      7. Aは暗号文を自分のプライベート鍵で複合化してメッセージを読む。
  • SSL/TLSを使った通信
    1. ClientHello(クライアント→サーバー)
      • 使用できる暗号の一覧
    2. ServerHello(サーバー→クライアント)
      • 使用する暗号を決める
    3. Certificate(サーバー→クライアント)
      • 証明書を提示
    4. ServerKeyExchange(サーバー→クライアント)
      • 証明書では足りない情報があれば追加の情報を
    5. ServerHelloDone(サーバー→クライアント)
      • ServerHelloから始まるメッセージの一連の終わりを告げる。
    6. ClientKeyExchange(クライアント→サーバー)
      • プレマスターシークレットを送る。
      • このプレマスターシークレットを元にサーバー、クライアントは共通のマスターシークレットを作成する。
    7. ChangeCipherSpec(クライアント→サーバー)
      • これを境にしてメッセージを暗号に切り替える。
    8. Finished(クライアント→サーバー)
      • 暗号に切り替えてFinishedメッセージを送る。サーバーで複合化出来るか調べる。
    9. ChangeCipherSpec(サーバー→クライアント)
      • これを境にしてメッセージを暗号に切り替える。
    10. Finished(サーバー→クライアント)
      • 暗号に切り替えてFinishedメッセージを送る。
  • ブラウザによるWEBサーバーの証明書の検証方法(中間証明書がある場合)
    1. ブラウザはWEBサーバーのサーバー証明書を入手
      • ブラウザには主なルート証明局の公開鍵(証明書)がインストールされている
    2. ブラウザはルート証明局にデジタル署名(ルート証明局の秘密鍵)されたサーバー証明書をルート証明局の証明書(公開鍵)で検証
    3. 中間証明書がある場合は中間証明書のデジタル署名をルート証明局の証明書(公開鍵)で検証
      • 中間証明書にある(公開鍵+付加情報)から生成したハッシュ値とデジタル署名(公開鍵+付加情報)を複合したハッシュ値を検証
    4. 中間証明局の公開鍵を入手
    5. 中間証明局の公開鍵でサーバー証明書を検証
    6. WEBサーバーの公開鍵を入手

参考にしたのは
結城浩さん署「暗号技術入門 不思議の国のアリス