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など |
セッション層 | SOCKET | SSL SOCKET |
トランスポート層 | TCP / UDP | TCP / UDP |
ネットワーク層 | IP | IP |
データリンク層 物理層 | Ethernet | Ethernet |
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のプロトコル
- ClientHello
Client は、最初に ClientHello を送信。
サポートしている暗号化方式などを送信。
既存セッションの再開の場合は、セッションIDも送信。
ServerHello を待機。
- ServerHello
サーバは、クライアントが送信してきた暗号化方式の中で、最強の暗号化方式を指定。
ClientがセッションIDを指定した場合、既存セッションを再開。
- ServerCertificate (optional)
X.509で規定された形式の証明書を送付。
- ServerKeyExchange (optional)
サーバの公開鍵情報を送信。
- CertificateRequest (optional)
暗号化方式が適切でない場合、クライアントに証明書を要求。
- ServerHelloDone
送信が終わったことを通知し、Client からの応答を待機。
- ClientCertificate (optional)
ServerCertificate を受信後に、クライアントから証明書を送信。
Server からの適切な証明書を持っていない場合、no_certificate を返却。
Server は、設定によっては、コネクションを切断。
- ClientKeyExchange
選択された公開鍵方式で暗号化し、セッション鍵を送信。
- CertificateVerify (optional)
クライアントのの証明書を検証するために送信。
- Finished
Server と Client の通信が終了したことを示すために送信。
- (ChangeCipherSpec)
暗号化の方式を決定し、暗号化を開始。
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
|
参考資料