SSL デバッグツールを使う (ssltap

ニュースグループ: netscape.public.mozilla.crypto
テクニカル コンタクト: Ian McGreer
管理者: Wan-Teh Chang

SSL デバッグツールとは、 SSL 指向のコマンドライン プロキシです。 SSL は TCP 接続を監視し、やり取りされるデータを表示します。 接続が SSL を通している場合、データ表示には処理された SSL レコードおよびハンドシェークが含まれます。

利用環境

このツールは、 Solaris 2.5.1 (SunOS 5.5.1) および Windows NT 4.0 上でビルドされています。

概要

ssltap は、 rendezvous port 上のソケットを開き、 クライアント側からの接続要求 (incoming connection) を待ちます。 この接続信号を受け取ると、ツールはサーバ側の特定されたホストネームおよびポートに、 もう一つの接続を開始します。クライアントからサーバに対して送られたあらゆるデータを通し、 また同様に、サーバからクライアントに対して送られたあらゆるデータも通します。 ツールはまた、そのツールを呼び出しているシェルウィンドウにデータを表示します。 ここで述べられているように、SSL ストリームと共に、プレイン HTTP 接続でも、 あらゆる TCP プロトコルでも機能します。

ツールには、どのような暗号化されたメッセージデータも解読することは出来ません。 ツールは、保護された接続が確立する前の、 ハンドシェークの一段階であるプレインテキストやバイナリーデータを読むためのものです。

構文

SSL デバッグツールを使用するには、次のコマンドをコマンドシェルに打ち込んでください:

ssltap [-vhfsxl] [-p port] hostname:port

オプション

コマンドには、 hostname:port 以外のオプションは必要ありませんが、 接続干渉や出力 (output) の管理にオプションを利用します。 コマンドに対するオプションは次の通りです:

-v

ツールに対してバージョンを示す文字列を表示します。

-h

hex/ASCII プリントに切り替えます。生データをそのまま出力するのではなく、 それぞれの記録を 16 進数 (hex values) に変換したものを、それに続いて同じデータを ASCII 文字で表したものを表示します。この二つは、垂直線で分離表示されます。 プリントされない文字は、ドットに入れ替えられます。

-f

楽しいプリントをします。出力は、カラーの HTML で表示されます。 クライアントからサーバ側へ送られたデータは青で、サーバの応答は赤で示されます。 ループモード (looping mode) にした場合、接続別に水平線で仕切られます。 このオプションは、ブラウザーへの出力をアップロードする際に使えます。

-s

SSL 構文解析とデコードを立ち上げます。 ツールは、自動的には SSL セッションを検知しません。SSL 接続に干渉する場合、 ツールが SSL 構造を検出しデコードできるように、このオプションを使います。

ツールが証明書チェーンを検出した場合、DER エンコードされた (DER-encoded) 証明書をカレント・ディレクトリ内のファイルに保存します。ファイルは、 cert.0x と名前を付けられます。ここで、 x は、 その証明書のシーケンス番号を示します。

-h と共に -s オプションが使用された場合、 それそれのレコードについて二つの別個に表示されます: プレイン hex/ASCII 出力と解析済み SSL 出力の二つです。

-x

解析済み SSL レコード内部のデコードされていないデータを hex/ASCII 表示に切り替えます。 -s オプションとのみ利用されます。このオプションは、 -h オプションの場合と同じ出力フォーマットを使います。

-l

ループに切り替えます。つまり、最初の接続が完了した後にも、 接続を停止するのではなく、接続を受け入れつづけます。

-p ポート

ディフォルトの rendezvous port (1924) を別のポートに切り替えます。 よく知られたポート番号は次のとおりです:

HTTP   80

HTTPS   443

SMTP   25

FTP   21

IMAP   143

IMAPS   993 (IMAP over SSL)

NNTP   119

NNTPS   563 (NNTP over SSL)

実例

SSL デバッグツールをどのような接続情報に干渉する場合にも利用できます。 hostname:port 以外のオプションを全く付けずに ssltap コマンドを出すという最も基本的な方法でもツールを利用することも出来ますが、 この方法で得られる情報はそれほど有用なものではありません。

例えば、あなたの開発用コンピュータを intercept と呼ぶとしましょう。 デバッグツールを使用する最も簡単な方法は、コマンドシェルから次のコマンドを実行することです:

ssltap www.netscape.com:80

プログラムは、ディフォルトの 1924 ポートで接続要求を待ちます。 ブラウザウィンドウに、URL の http://intercept:1924 を入れてください。 ブラウザは要求されたページを、 www.netscape.com にあるサーバから読み込みますが、 そのページは、 intercept にあるデバッグツールによって途中で干渉され、 ブラウザに渡されます。

ページがブラウザに渡される途中、あなたがコマンドを発したコマンドシェルにデータが表示されます。 クライアントからサーバに送られたデータは、次の記号 (symbols) によって囲まれます:

--> [ データ ]

サーバからクライアントに送られたデータは、次の記号 (symbols) によって囲まれます:

<-- [ データ ]

生データのストリームは、標準出力に送られ、どのような形にも変換されることはありません。 この結果として、音、画面のフラッシュやコマンドシェルウィンドウのクラッシュという、 奇妙なことが起こります。データを基本的な、出力可能な変換 (printable interpretation) を出力するには、 -h オプションか、もし SSL 接続を見ている場合は、 -s オプションを利用してください。

要求したページがブラウザ上では不完全に見えることに気が付くでしょう。 これは、ディフォルトで、ツールが最初の接続が完了すると閉じてしまい、 ブラウザが画像を表示できないからです。ツールが接続を続行するようにするには、 -l オプションを使ってループモードに切り替えます。

次の例では、一般的に使われるオプションの組み合わせを示します。

例 1

この例の中の s および x オプションは、 SSL 構文解析とデコードされていない値を hex/ASCII 形式に切り替えるものです。 出力は、テキストファイルに経路指定されます。

コマンド
ssltap.exe -sx -p 444 interzone.mcom.com:443 > sx.txt
出力
Connected to interzone.mcom.com:443
--> [
alloclen = 66 bytes
   [ssl2] ClientHelloV2 {
            version = {0x03, 0x00}
            cipher-specs-length = 39 (0x27)
            sid-length = 0 (0x00)
            challenge-length = 16 (0x10)
            cipher-suites = {
                (0x010080) SSL2/RSA/RC4-128/MD5
                  (0x020080) SSL2/RSA/RC4-40/MD5
                  (0x030080) SSL2/RSA/RC2CBC128/MD5
                  (0x040080) SSL2/RSA/RC2CBC40/MD5
                  (0x060040) SSL2/RSA/DES64CBC/MD5
                  (0x0700c0) SSL2/RSA/3DES192EDE-CBC/MD5
                  (0x000004) SSL3/RSA/RC4-128/MD5
                  (0x00ffe0) SSL3/RSA-FIPS/3DES192EDE-CBC/SHA
                  (0x00000a) SSL3/RSA/3DES192EDE-CBC/SHA
                  (0x00ffe1) SSL3/RSA-FIPS/DES64CBC/SHA
                  (0x000009) SSL3/RSA/DES64CBC/SHA
                  (0x000003) SSL3/RSA/RC4-40/MD5
                  (0x000006) SSL3/RSA/RC2CBC40/MD5
                  }
            session-id = { }
            challenge = { 0xec5d 0x8edb 0x37c9 0xb5c9 0x7b70 0x8fe9 0xd1d3
0x2592 }
}
]
<-- [
SSLRecord {
   0: 16 03 00 03 e5 |.....
   type = 22 (handshake)
   version = { 3,0 }
   length = 997 (0x3e5)
   handshake {
   0: 02 00 00 46 |...F
      type = 2 (server_hello)
      length = 70 (0x000046)
            ServerHello {
            server_version = {3, 0}
            random = {...}
   0: 77 8c 6e 26 6c 0c ec c0 d9 58 4f 47 d3 2d 01 45 |
wn&amp;l.ì..XOG.-.E
   10: 5c 17 75 43 a7 4c 88 c7 88 64 3c 50 41 48 4f 7f |
\.uC§L.Ç.d&lt;PAHO.
                  session ID = {
                  length = 32
                contents = {..}
   0: 14 11 07 a8 2a 31 91 29 11 94 40 37 57 10 a7 32 | ...¨*1.)..@7W.§2
   10: 56 6f 52 62 fe 3d b3 65 b1 e4 13 0f 52 a3 c8 f6 | VoRbþ=³e±...R£È.
         }
               cipher_suite = (0x0003) SSL3/RSA/RC4-40/MD5
         }
   0: 0b 00 02 c5 |...Å
      type = 11 (certificate)
      length = 709 (0x0002c5)
            CertificateChain {
            chainlength = 706 (0x02c2)
               Certificate {
            size = 703 (0x02bf)
               data = { saved in file 'cert.001' }
            }
         }
   0: 0c 00 00 ca |....
         type = 12 (server_key_exchange)
         length = 202 (0x0000ca)
   0: 0e 00 00 00 |....
         type = 14 (server_hello_done)
         length = 0 (0x000000)
   }
}
]
--> [
SSLRecord {
   0: 16 03 00 00 44 |....D
   type = 22 (handshake)
   version = { 3,0 }
   length = 68 (0x44)
   handshake {
   0: 10 00 00 40 |...@
   type = 16 (client_key_exchange)
   length = 64 (0x000040)
         ClientKeyExchange {
            message = {...}
         }
   }
}
]
--> [
SSLRecord {
   0: 14 03 00 00 01 |.....
   type = 20 (change_cipher_spec)
   version = { 3,0 }
   length = 1 (0x1)
   0: 01 |.
}
SSLRecord {
   0: 16 03 00 00 38 |....8
   type = 22 (handshake)
   version = { 3,0 }
   length = 56 (0x38)
               < encrypted >
}
]
<-- [
SSLRecord {
   0: 14 03 00 00 01 |.....
   type = 20 (change_cipher_spec)
   version = { 3,0 }
   length = 1 (0x1)
   0: 01 |.
}
]
<-- [
SSLRecord {
   0: 16 03 00 00 38 |....8
   type = 22 (handshake)
   version = { 3,0 }
   length = 56 (0x38)
                  < encrypted >
}
]
--> [
SSLRecord {
   0: 17 03 00 01 1f |.....
   type = 23 (application_data)
   version = { 3,0 }
   length = 287 (0x11f)
               < encrypted >
}
]
<-- [
SSLRecord {
   0: 17 03 00 00 a0 |....
   type = 23 (application_data)
   version = { 3,0 }
   length = 160 (0xa0)
               < encrypted >
}
]
<-- [
SSLRecord {
0: 17 03 00 00 df |....ß
   type = 23 (application_data)
   version = { 3,0 }
   length = 223 (0xdf)
               < encrypted >
}
SSLRecord {
   0: 15 03 00 00 12 |.....
   type = 21 (alert)
   version = { 3,0 }
   length = 18 (0x12)
               < encrypted >
}
]
Server socket closed.

例 2

オプション -s は SSL 構文解析を起動します。 この例ではオプション -x が利用されないため、 デコードされていない値が生データとして出力されます。 その出力はテキスト ファイルに経路指定されます。

コマンド
ssltap.exe -s  -p 444 interzone.mcom.com:443 > s.txt

出力

Connected to interzone.mcom.com:443
--> [
alloclen = 63 bytes
   [ssl2] ClientHelloV2 {
            version = {0x03, 0x00}
            cipher-specs-length = 36 (0x24)
            sid-length = 0 (0x00)
            challenge-length = 16 (0x10)
            cipher-suites = {
                  (0x010080) SSL2/RSA/RC4-128/MD5
                  (0x020080) SSL2/RSA/RC4-40/MD5
                  (0x030080) SSL2/RSA/RC2CBC128/MD5
                  (0x060040) SSL2/RSA/DES64CBC/MD5
                  (0x0700c0) SSL2/RSA/3DES192EDE-CBC/MD5
                  (0x000004) SSL3/RSA/RC4-128/MD5
                  (0x00ffe0) SSL3/RSA-FIPS/3DES192EDE-CBC/SHA
                  (0x00000a) SSL3/RSA/3DES192EDE-CBC/SHA
                  (0x00ffe1) SSL3/RSA-FIPS/DES64CBC/SHA
                  (0x000009) SSL3/RSA/DES64CBC/SHA
                  (0x000003) SSL3/RSA/RC4-40/MD5
                  }
               session-id = { }
            challenge = { 0x713c 0x9338 0x30e1 0xf8d6 0xb934 0x7351 0x200c
0x3fd0 }
]
<-- [
SSLRecord {
   type = 22 (handshake)
   version = { 3,0 }
   length = 997 (0x3e5)
   handshake {
         type = 2 (server_hello)
         length = 70 (0x000046)
            ServerHello {
            server_version = {3, 0}
            random = {...}
            session ID = {
               length = 32
               contents = {..}
               }
               cipher_suite = (0x0003) SSL3/RSA/RC4-40/MD5
            }
         type = 11 (certificate)
         length = 709 (0x0002c5)
            CertificateChain {
               chainlength = 706 (0x02c2)
               Certificate {
                  size = 703 (0x02bf)
                  data = { saved in file 'cert.001' }
               }
            }
         type = 12 (server_key_exchange)
         length = 202 (0x0000ca)
         type = 14 (server_hello_done)
         length = 0 (0x000000)
   }
}
]
--> [
SSLRecord {
   type = 22 (handshake)
   version = { 3,0 }
   length = 68 (0x44)
   handshake {
         type = 16 (client_key_exchange)
         length = 64 (0x000040)
            ClientKeyExchange {
               message = {...}
            }
   }
}
]
--> [
SSLRecord {
   type = 20 (change_cipher_spec)
   version = { 3,0 }
   length = 1 (0x1)
}
SSLRecord {
   type = 22 (handshake)
   version = { 3,0 }
   length = 56 (0x38)
               < encrypted >
}
]
<-- [
SSLRecord {
   type = 20 (change_cipher_spec)
   version = { 3,0 }
   length = 1 (0x1)
}
]
<-- [
SSLRecord {
   type = 22 (handshake)
   version = { 3,0 }
   length = 56 (0x38)
               < encrypted >
}
]
--> [
SSLRecord {
   type = 23 (application_data)
   version = { 3,0 }
   length = 287 (0x11f)
               < encrypted >
}
]
[
SSLRecord {
   type = 23 (application_data)
   version = { 3,0 }
   length = 160 (0xa0)
               < encrypted >
}
]
<-- [
SSLRecord {
   type = 23 (application_data)
   version = { 3,0 }
   length = 223 (0xdf)
               < encrypted >
}
SSLRecord {
   type = 21 (alert)
   version = { 3,0 }
   length = 18 (0x12)
               < encrypted >
}
]
Server socket closed.

例 3

この例でのオプション -h は、 hex/ASCII 形式に切り替えます。 SSL 構文解析やデコードはしません。出力は、テキストファイルに経路指定されます。

コマンド
ssltap.exe -h  -p 444 interzone.mcom.com:443 > h.txt
出力
Connected to interzone.mcom.com:443
--> [
    0: 80 40 01 03 00 00 27 00 00 00 10 01 00 80 02 00 | .@....'.........
   10: 80 03 00 80 04 00 80 06 00 40 07 00 c0 00 00 04 | .........@......
   20: 00 ff e0 00 00 0a 00 ff e1 00 00 09 00 00 03 00 | ........á.......
   30: 00 06 9b fe 5b 56 96 49 1f 9f ca dd d5 ba b9 52 | ..þ[V.I.\xd9 ...º¹R
   40: 6f 2d |o-
]
<-- [
    0: 16 03 00 03 e5 02 00 00 46 03 00 7f e5 0d 1b 1d | ........F.......
   10: 68 7f 3a 79 60 d5 17 3c 1d 9c 96 b3 88 d2 69 3b | h.:y`..&lt;..³.Òi;
   20: 78 e2 4b 8b a6 52 12 4b 46 e8 c2 20 14 11 89 05 | x.K.¦R.KFè. ...
   30: 4d 52 91 fd 93 e0 51 48 91 90 08 96 c1 b6 76 77 | MR.ý..QH.....¶vw
   40: 2a f4 00 08 a1 06 61 a2 64 1f 2e 9b 00 03 00 0b | *ô..¡.a¢d......
   50: 00 02 c5 00 02 c2 00 02 bf 30 82 02 bb 30 82 02 | ..Å......0...0..
   60: 24 a0 03 02 01 02 02 02 01 36 30 0d 06 09 2a 86 | $ .......60...*.
   70: 48 86 f7 0d 01 01 04 05 00 30 77 31 0b 30 09 06 | H.÷......0w1.0..
   80: 03 55 04 06 13 02 55 53 31 2c 30 2a 06 03 55 04 | .U....US1,0*..U.
   90: 0a 13 23 4e 65 74 73 63 61 70 65 20 43 6f 6d 6d | ..#Netscape Comm
   a0: 75 6e 69 63 61 74 69 6f 6e 73 20 43 6f 72 70 6f | unications Corpo
   b0: 72 61 74 69 6f 6e 31 11 30 0f 06 03 55 04 0b 13 | ration1.0...U...
   c0: 08 48 61 72 64 63 6f 72 65 31 27 30 25 06 03 55 | .Hardcore1'0%..U
   d0: 04 03 13 1e 48 61 72 64 63 6f 72 65 20 43 65 72 | ....Hardcore Cer
   e0: 74 69 66 69 63 61 74 65 20 53 65 72 76 65 72 20 | tificate Server
   f0: 49 49 30 1e 17 0d 39 38 30 35 31 36 30 31 30 33 | II0...9805160103
<additional data lines>
]
<additional records in same format>
Server socket closed.

例 4

この例でのオプション -s は SSL 構文解析を起動し、 オプション -h は hex/ASCII 形式に切り替えます。 両方の形式がそれぞれの記録にたいし示されます。 出力は、テキストファイルに経路指定されます。

コマンド
ssltap.exe -hs -p 444 interzone.mcom.com:443 > hs.txt
出力
Connected to interzone.mcom.com:443
--> [
    0: 80 3d 01 03 00 00 24 00 00 00 10 01 00 80 02 00 | .=....$.........
   10: 80 03 00 80 04 00 80 06 00 40 07 00 c0 00 00 04 | .........@......
   20: 00 ff e0 00 00 0a 00 ff e1 00 00 09 00 00 03 03 | ........á.......
   30: 55 e6 e4 99 79 c7 d7 2c 86 78 96 5d b5 cf e9 |U..yÇ\xb0 ,.x.]µÏé
alloclen = 63 bytes
   [ssl2] ClientHelloV2 {
            version = {0x03, 0x00}
            cipher-specs-length = 36 (0x24)
            sid-length = 0 (0x00)
            challenge-length = 16 (0x10)
            cipher-suites = {
                  (0x010080) SSL2/RSA/RC4-128/MD5
                  (0x020080) SSL2/RSA/RC4-40/MD5
                  (0x030080) SSL2/RSA/RC2CBC128/MD5
                  (0x040080) SSL2/RSA/RC2CBC40/MD5
                  (0x060040) SSL2/RSA/DES64CBC/MD5
                  (0x0700c0) SSL2/RSA/3DES192EDE-CBC/MD5
                  (0x000004) SSL3/RSA/RC4-128/MD5
                  (0x00ffe0) SSL3/RSA-FIPS/3DES192EDE-CBC/SHA
                  (0x00000a) SSL3/RSA/3DES192EDE-CBC/SHA
                  (0x00ffe1) SSL3/RSA-FIPS/DES64CBC/SHA
                  (0x000009) SSL3/RSA/DES64CBC/SHA
                  (0x000003) SSL3/RSA/RC4-40/MD5
                  }
            session-id = { }
            challenge = { 0x0355 0xe6e4 0x9979 0xc7d7 0x2c86 0x7896 0x5db

0xcfe9 }
}
]
<additional records in same formats>
Server socket closed.

利用のヒント