ASH | サーバ | セキュリティ | Linux | FreeBSD | DB | Web | CGI | Perl | Java | XML | プログラム | ネットワーク | 標準 | Tips集

SSLについて

SSLの概要

 SSLとは、Secure Sockets Layerの略で、Webサーバとブラウザ間を安全に通信するため、Netscape社が提唱した通信手段(プロトコル)です。
 SSLは、セッション層で、暗号化による機密性、認証による正当性、完全性を提供しています。 機能としては、データの暗号化通信、通信相手を特定するための認証、通信データの書き換えが行われていないか調べるメッセージ認証の3つがあります。 現在、Netscape NavigatorやInternet Exploreなどには、標準で実装されています。 ただ、HTTPプロトコルのみ対象しているのではないので、TELNET、FTP、NNTP、LDAPなど、他のプロトコルにも実装することも可能です。
 SSLでWebデータを暗号化して転送する場合のURLは、https://www.server.name/ のようになります。
 デフォルトポートは、443番ポート(https)を使用します。

OSIの7階層通信手順SSL通信手順
アプリケーション層
プレゼンテーション層
HTTP/TELNET/FTPなどHTTP/TELNET/FTPなど
セッション層SOCKETSSL
SOCKET
トランスポート層TCP / UDPTCP / UDP
ネットワーク層IPIP
データリンク層
物理層
EthernetEthernet

SSLによるWebサーバ認証の流れ

 SSLによるWebサーバ認証までの、作業の流れについて説明します。
 []で囲んだものは、データを表します。

Webサーバの認証書の取得

Webサーバ(sv)                     認証局(CA)
----------------------------      ----------------------------
認証書の作成
  [認証書]
公開鍵、秘密鍵の作成
  [svの公開鍵][svの秘密鍵]
認証書の発行申請             ---> 審査
  [署名付認証書]             <--- 認証書の発行
認証書のインストール

Webサーバの認証(ホスト認証)

クライアント(cl)                      Webサーバ(sv)
--------------------------------      --------------------------------
  [CAの公開鍵][暗号方式リスト]          [svの公開鍵][svの秘密鍵][署名付認証書]

https(443ポート)で接続要求     --->
使用可能な暗号方式を通知         --->   [暗号方式リスト]
  [使用する暗号方式]             <--- 最強の暗号方式を選択して通知
  [署名付認証書]                 <--- 署名付認証書の提示
CAの公開鍵で署名付認証書の確認
署名付認証書からsvの公開鍵を取得
  [svの公開鍵]
ランダム値から共有鍵を生成
  [共有鍵]
共有鍵をsvの公開鍵で暗号化し送信 ---> 共有鍵をsvの秘密鍵で復号
                                       [共有鍵]

(以降のデータは、共有鍵を使って暗号化して通信)

共有鍵で暗号化して送信           <--> 共有鍵で暗号化して送信

SSL3の通信プロトコルフロー

 SSL3における通信プロトコルフローです。
 SSL3では、高速化するため、新規セッション確立時と、既存セッション再開時でフローが異なります。

新規セッション確立時のフロー

  Client                    Server
 --------------------      --------------------
  ClientHello         --->
                            ServerHello
                            Certificate*
                            ServerKeyExchange*
                            CertificateRequest*
                      <---  ServerHelloDone
  Certificate*
  ClientKeyExchange
  CertificateVerify*
  (ChangeCipherSpec)
  Finished            --->
                            (ChangeCipherSpec)
                      <---  Finished

  ApplicationData     <-->  ApplicationData

既存セッション再開時のフロー

  Client                    Server
 --------------------      --------------------
  ClientHello         --->
                            ServerHello
                            (ChangeCipherSpec)
                      <---  Finished
  (ChangeCipherSpec)
  Finished            --->
  ApplicationData     <-->  ApplicationData

SSL3のプロトコル

SSLのメッセージ形式

 SSLは、セッション層での暗号化を実現していますので、通信データには、DLCヘッダ、IPヘッダ、TCPヘッダが付加されます。

  +-------------------------------------------------------+--------
  |    DLCヘッダ(イーサネットヘッダ)14バイト            |       |
  +-------------------------------------------------------+--------
  |    IPヘッダ 40バイト                                          |
  --------+--------------------------------------------------------
  |       |    TCPヘッダ 40バイト                                 |
  --------+-------+-----------+---+---+----------------------------
  |               |           |SIZ|TYP|  SSLデータ                |
  ----------------+-----------+---+---+----------------------------

 ここでは、クライアントとサーバ間でどのようにして、暗号化方式を決定しているかを確認するために、通信データを見てみましょう。
 そのため、SSLのメッセージの中の、ClientHelloとServerHelloの一部のみ扱っています。
 全体を知りたい場合は、Netscape社のホームページに詳しい解説がありますので、そちらを参照してください。

ClientHello(SSL2/SSL3共通)のメッセージ形式

 ClientHelloとは、SSL通信をするために、最初にクライアントから出すメッセージです。
 ClientHelloは、SSL2とSSL3で共通になっています。
 以下に、ネットワーク上のパケット内容を示します。

  char[1] メッセージサイズ
  char[1] メッセージタイプ
    01 : Client Hello
  char[2] SSLバージョン
    03 00 : SSL3
    00 02 : SSL2
  char[2] 暗号化方式(CipherSuite)のサイズ(CS)
  char[2] セッションIDサイズ(SS)
  char[2] ランダム値サイズ(RS)
  char[CS] 暗号化方式リスト
    ※暗号化方式一覧を参照
  char[SS] セッションID
  char[RS] ランダム値

ServerHello(SSL3)のメッセージ形式

  char[2] メッセージサイズ
  char[1] メッセージタイプ
    00 : SSL3形式
  char[1]
  char[2] メッセージサイズ
  char[1] SSL3メッセージタイプ
    02 : Server Hello
  char[1]
  char[2] ServerHelloサイズ
  char[2] SSLバージョン
    03 00 : SSL3
  char[32] サーバランダム値
  char[1] セッションIDサイズ(SS)
  char[SS] セッションIDデータ
  char[2] 暗号化方式
    xx xx : 暗号化方式の下位2バイト
    ※暗号化方式一覧を参照
  char[1]
  char[1] SSL3メッセージタイプ
    0b : certificate開始
  char[1]
  char[2] certificateサイズ(AS)
  char[AS] 証明書(certificate)データ

ServerHello(SSL2)のメッセージ形式

  char[1] メッセージサイズ
  char[1] メッセージタイプ
    04 : Server Hello
  char[1] SESSION-ID-HIT
  char[1] CERTIFICATE-TYPE
  char[2] SSLバージョン
    00 02 : SSL2
  char[2] 証明書のサイズ(AS)
  char[2] 暗号化方式(CipherSuite)のサイズ(CS)
  char[2] セッションIDサイズ(SS)
  char[AS] 証明書データ
  char[CS] 暗号化方式データ
  char[SS] セッションIDデータ

暗号化方式一覧

SSL2の暗号化方式一覧

 SSL2の暗号化方式は3バイトで表現します。

 コード値   暗号化方式
  01 00 80 : SSL_RC4_128_WITH_MD5
  02 00 80 : SSL_RC4_128_EXPORT40_WITH_MD5
  03 00 80 : SSL_RC2_CBC_128_CBC_WITH_MD5
  04 00 80 : SSL_RC2_CBC_128_CBC_EXPORT40_WITH_MD5
  05 00 80 : SSL_IDEA_128_CBC_WITH_MD5
  06 00 40 : SSL_DES_64_CBC_WITH_MD5
  07 00 c0 : SSL_DES_192_EDE3_CBC_WITH_MD5

SSL3の暗号化方式一覧

 SSL3の暗号化方式は2バイトで表現します。
 SSL2との上位互換を保つため、ClientHelloでは、先頭に00が付加されます。

 コード値   暗号化方式
  00 00 : SSL_NULL_WITH_NULL_NULL
  00 01 : SSL_RSA_WITH_NULL_MD5
  00 02 : SSL_RSA_WITH_NULL_SHA
  00 03 : SSL_RSA_EXPORT_WITH_RC4_40_MD5
  00 04 : SSL_RSA_WITH_RC4_128_MD5
  00 05 : SSL_RSA_WITH_RC4_128_SHA
  00 06 : SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5
  00 07 : SSL_RSA_WITH_IDEA_CBC_SHA
  00 08 : SSL_RSA_EXPORT_WITH_DES40_CBC_SHA
  00 09 : SSL_RSA_WITH_DES_CBC_SHA
  00 0a : SSL_RSA_WITH_3DES_EDE_CBC_SHA
  00 0b : SSL_DH_DSS_EXPORT_WITH_DES40_CBC_SHA
  00 0c : SSL_DH_DSS_WITH_DES_CBC_SHA
  00 0d : SSL_DH_DSS_WITH_3DES_EDE_CBC_SHA
  00 0e : SSL_DH_RSA_EXPORT_WITH_DES40_CBC_SHA
  00 0f : SSL_DH_RSA_WITH_DES_CBC_SHA
  00 10 : SSL_DH_RSA_WITH_3DES_EDE_CBC_SHA
  00 11 : SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA
  00 12 : SSL_DHE_DSS_WITH_DES_CBC_SHA
  00 13 : SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA
  00 14 : SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA
  00 15 : SSL_DHE_RSA_WITH_DES_CBC_SHA
  00 16 : SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA
  00 17 : SSL_DH_anon_EXPORT_WITH_RC4_40_MD5
  00 18 : SSL_DH_anon_WITH_RC4_128_MD5
  00 19 : SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA
  00 1a : SSL_DH_anon_WITH_DES_CBC_SHA
  00 1b : SSL_DH_anon_WITH_3DES_EDE_CBC_SHA
  00 1c : SSL_FORTEZZA_KEA_WITH_NULL_SHA
  00 1d : SSL_FORTEZZA_KEA_WITH_FORTEZZA_CBC_SHA
  00 1e : SSL_FORTEZZA_KEA_WITH_RC4_128_SHA
  00 62 : 不明(IE5.5、Netscape4.7などで使用)
  00 64 : 不明(IE5.5、Netscape4.7などで使用)
  fe fe : 不明(Netscape4.7などで使用)
  fe ff : 不明(Netscape4.7などで使用)

各ブラウザにおけるClientHelloの通信例

 以下にIE5.5とNetscape4.7におけるClientHelloの通信パケットの内容の例を示します。
 SSL3におけるClientHelloの暗号方式として、IE5.5は14種類、Netscape4.7は15種類の暗号方式が利用可能なことがわかります。 この暗号方式リストの順番は、ブラウザによって異なります。 Webサーバは常に最強の暗号方式を採用するため、ServerHelloが返す暗号方式は両方とも "00 00 04 : SSL_RSA_WITH_RC4_128_MD5"となっています。

SSL3 ClientHello (IE 5.5)

  43     Size
  01     Client Hello
  03 00  SSL version (Major Minor)
  00 2a  CipherSpec size
  00 00  SessionID size
  00 10  Random size

  00 00 04  SSL_RSA_WITH_RC4_128_MD5
  00 00 05  SSL_RSA_WITH_RC4_128_SHA
  00 00 0a  SSL_RSA_WITH_3DES_EDE_CBC_SHA
  01 00 80  SSL_RC4_128_WITH_MD5
  07 00 c0  SSL_DES_192_EDE3_CBC_WITH_MD5
  03 00 80  SSL_RC2_CBC_128_CBC_WITH_MD5
  00 00 09  SSL_RSA_WITH_DES_CBC_SHA
  06 00 40  SSL_DES_64_CBC_WITH_MD5
  00 00 64  ?
  00 00 62  ?
  00 00 03  SSL_RSA_EXPORT_WITH_RC4_40_MD5
  00 00 06  SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5
  02 00 80  SSL_RC4_128_EXPORT40_WITH_MD5
  04 00 80  SSL_RC2_CBC_128_CBC_EXPORT40_WITH_MD5

  f3 21 16 6f 76 13 f5 c4 8a 63 5b a2 94 ce 17 38  Random

SSL3 ClientHello (Netscape 4.7)

  46     Size
  01     Client Hello
  03 00  SSL version (Major Minor)
  00 2d  CipherSpec size
  00 00  SessionID size
  00 10  Random size

  01 00 80  SSL_RC4_128_WITH_MD5
  02 00 80  SSL_RC4_128_EXPORT40_WITH_MD5
  03 00 80  SSL_RC2_CBC_128_CBC_WITH_MD5
  04 00 80  SSL_RC2_CBC_128_CBC_EXPORT40_WITH_MD5
  06 00 40  SSL_DES_64_CBC_WITH_MD5
  07 00 c0  SSL_DES_192_EDE3_CBC_WITH_MD5
  00 00 04  SSL_RSA_WITH_RC4_128_MD5
  00 fe ff  ?
  00 00 0a  SSL_RSA_WITH_3DES_EDE_CBC_SHA
  00 fe fe  ?
  00 00 09  SSL_RSA_WITH_DES_CBC_SHA
  00 00 64  ?
  00 00 62  ?
  00 00 03  SSL_RSA_EXPORT_WITH_RC4_40_MD5
  00 00 06  SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5

  9d d1 91 ce 43 dc e3 c5 1f 5c 26 ac 5e 44 4f ea  Random

SSL2 ClientHello (IE 5.5)

  2b     Size
  01     Client Hello
  00 02  SSL version
  00 12  CipherSpec size
  00 00  SessionID size
  00 10  Random size

  01 00 80 SSL_RC4_128_WITH_MD5
  07 00 c0 SSL_DES_192_EDE3_CBC_WITH_MD5
  03 00 80 SSL_RC2_CBC_128_CBC_WITH_MD5
  06 00 40 SSL_DES_64_CBC_WITH_MD5
  02 00 80 SSL_RC4_128_EXPORT40_WITH_MD5
  04 00 80 SSL_RC2_CBC_128_CBC_EXPORT40_WITH_MD5

  ac 63 c4 48 2f 87 61 be 68 e0 1e 9d 4c 0e 96 18  Random

参考資料



Copyright (C)1995-2002 ASH multimedia lab.
mail : info@ash.jp