summaryrefslogtreecommitdiffstats
path: root/security/nss/doc/html/ssltap.html
blob: e69b3758e3f6db95d863f0a38b9806676d104dc8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>SSLTAP</title><meta name="generator" content="DocBook XSL Stylesheets V1.78.1"><link rel="home" href="index.html" title="SSLTAP"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">SSLTAP</th></tr></table><hr></div><div class="refentry"><a name="ssltap"></a><div class="titlepage"></div><div class="refnamediv"><h2>Name</h2><p>ssltap — Tap into SSL connections and display the data going by </p></div><div class="refsynopsisdiv"><h2>Synopsis</h2><div class="cmdsynopsis"><p><code class="command">ssltap</code>  [-fhlsvx] [-p port] [hostname:port]</p></div></div><div class="refsection"><a name="idm233258230400"></a><h2>STATUS</h2><p>This documentation is still work in progress. Please contribute to the initial review in <a class="ulink" href="https://bugzilla.mozilla.org/show_bug.cgi?id=836477" target="_top">Mozilla NSS bug 836477</a>
    </p></div><div class="refsection"><a name="description"></a><h2>Description</h2><p>The SSL Debugging Tool <span class="command"><strong>ssltap</strong></span> is an SSL-aware command-line proxy. It watches TCP connections and displays the data going by. If a connection is SSL, the data display includes interpreted SSL records and handshaking</p></div><div class="refsection"><a name="options"></a><h2>Options</h2><div class="variablelist"><dl class="variablelist"><dt><span class="term">-f </span></dt><dd><p>
Turn on fancy printing. Output is printed in colored HTML. Data sent from the client to the server is in blue; the server's reply is in red. When used with looping mode, the different connections are separated with horizontal lines. You can use this option to upload the output into a browser. 
        </p></dd><dt><span class="term">-h </span></dt><dd><p>
Turn on hex/ASCII printing. Instead of outputting raw data, the command interprets each record as a numbered line of hex values, followed by the same data as ASCII characters. The two parts are separated by a vertical bar. Nonprinting characters are replaced by dots. 
        </p></dd><dt><span class="term">-l  prefix</span></dt><dd><p>
Turn on looping; that is, continue to accept connections rather than stopping after the first connection is complete.
          </p></dd><dt><span class="term">-p  port</span></dt><dd><p>Change the default rendezvous port (1924) to another port.</p><p>The following are well-known port numbers:</p><p>
          * HTTP   80
          </p><p>
	      * HTTPS  443
	      </p><p>
          * SMTP   25
          </p><p>
          * FTP    21
          </p><p>
          * IMAP   143
          </p><p>
          * IMAPS  993 (IMAP over SSL)
          </p><p>
          * NNTP   119
          </p><p>
          * NNTPS  563 (NNTP over SSL) 
          </p></dd><dt><span class="term">-s </span></dt><dd><p>
Turn on SSL parsing and decoding. The tool does not automatically detect SSL sessions. If you are intercepting an SSL connection, use this option so that the tool can detect and decode SSL structures.
	  </p><p>
If the tool detects a certificate chain, it saves the DER-encoded certificates into files in the current directory. The files are named cert.0x, where x is the sequence number of the certificate.
	  </p><p>
If the -s option is used with -h, two separate parts are printed for each record: the plain hex/ASCII output, and the parsed SSL output.
          </p></dd><dt><span class="term">-v </span></dt><dd><p>Print a version string for the tool.</p></dd><dt><span class="term">-x </span></dt><dd><p>Turn on extra SSL hex dumps.</p></dd></dl></div></div><div class="refsection"><a name="basic-usage"></a><h2>Usage and Examples</h2><p>
You can use the SSL Debugging Tool to intercept any connection information. Although you can run the tool at its most basic by issuing the ssltap command with no options other than hostname:port, the information you get in this way is not very useful. For example, assume your development machine is called intercept. The simplest way to use the debugging tool is to execute the following command from a command shell:
      </p><pre class="programlisting">$ ssltap www.netscape.com</pre><p>
The program waits for an incoming connection on the default port 1924. In your browser window, enter the URL http://intercept:1924. The browser retrieves the requested page from the server at www.netscape.com, but the page is intercepted and passed on to the browser by the debugging tool on intercept. On its way to the browser, the data is printed to the command shell from which you issued the command. Data sent from the client to the server is surrounded by the following symbols: --&gt; [ data ] Data sent from the server to the client is surrounded by the following symbols: 
"left arrow"-- [ data ] The raw data stream is sent to standard output and is not interpreted in any way. This can result in peculiar effects, such as sounds, flashes, and even crashes of the command shell window. To output a basic, printable interpretation of the data, use the -h option, or, if you are looking at an SSL connection, the -s option. You will notice that the page you retrieved looks incomplete in the browser. This is because, by default, the tool closes down after the first connection is complete, so the browser is not able to load images. To make the tool 
continue to accept connections, switch on looping mode with the -l option. The following examples show the output from commonly used combinations of options.
      </p><p>Example 1 </p><pre class="programlisting">$ ssltap.exe -sx -p 444 interzone.mcom.com:443 &gt; sx.txt</pre><p>Output </p><pre class="programlisting">
Connected to interzone.mcom.com:443
--&gt;; [
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 }
}
]
&lt;-- [
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)
   }
}
]
--&gt; [
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 = {...}
         }
   }
}
]
--&gt; [
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)
               &lt; encrypted &gt;

}
]
&lt;-- [
SSLRecord {
   0: 14 03 00 00  01                                   |.....
   type    = 20 (change_cipher_spec)
   version = { 3,0 }
   length  = 1 (0x1)
   0: 01                                               |.
}
]
&lt;-- [
SSLRecord {
   0: 16 03 00 00  38                                   |....8
   type    = 22 (handshake)
   version = { 3,0 }
   length  = 56 (0x38)
                  &lt; encrypted &gt;

}
]
--&gt; [
SSLRecord {
   0: 17 03 00 01  1f                                   |.....
   type    = 23 (application_data)
   version = { 3,0 }
   length  = 287 (0x11f)
               &lt; encrypted &gt;
}
]
&lt;-- [
SSLRecord {
   0: 17 03 00 00  a0                                   |....
   type    = 23 (application_data)
   version = { 3,0 }
   length  = 160 (0xa0)
               &lt; encrypted &gt;

}
]
&lt;-- [
SSLRecord {
0: 17 03 00 00  df                                   |....ß
   type    = 23 (application_data)
   version = { 3,0 }
   length  = 223 (0xdf)
               &lt; encrypted &gt;

}
SSLRecord {
   0: 15 03 00 00  12                                   |.....
   type    = 21 (alert)
   version = { 3,0 }
   length  = 18 (0x12)
               &lt; encrypted &gt;
}
]
Server socket closed.
</pre><p>Example 2</p><p>
The -s option turns on SSL parsing. Because the -x option is not used in this example, undecoded values are output as raw data. The output is routed to a text file.
    </p><pre class="programlisting">$ ssltap -s  -p 444 interzone.mcom.com:443 &gt; s.txt</pre><p>Output </p><pre class="programlisting">
Connected to interzone.mcom.com:443
--&gt; [
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 }
]
&gt;-- [
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)
   }
}
]
--&gt; [
SSLRecord {
   type    = 22 (handshake)
   version = { 3,0 }
   length  = 68 (0x44)
   handshake {
         type = 16 (client_key_exchange)
         length = 64 (0x000040)
            ClientKeyExchange {
               message = {...}
            }
   }
}
]
--&gt; [
SSLRecord {
   type    = 20 (change_cipher_spec)
   version = { 3,0 }
   length  = 1 (0x1)
}
SSLRecord {
   type    = 22 (handshake)
   version = { 3,0 }
   length  = 56 (0x38)
               &gt; encrypted &gt;
}
]
&gt;-- [
SSLRecord {
   type    = 20 (change_cipher_spec)
   version = { 3,0 }
   length  = 1 (0x1)
}
]
&gt;-- [
SSLRecord {
   type    = 22 (handshake)
   version = { 3,0 }
   length  = 56 (0x38)
               &gt; encrypted &gt;
}
]
--&gt; [
SSLRecord {
   type    = 23 (application_data)
   version = { 3,0 }
   length  = 287 (0x11f)
               &gt; encrypted &gt;
}
]
[
SSLRecord {
   type    = 23 (application_data)
   version = { 3,0 }
   length  = 160 (0xa0)
               &gt; encrypted &gt;
}
]
&gt;-- [
SSLRecord {
   type    = 23 (application_data)
   version = { 3,0 }
   length  = 223 (0xdf)
               &gt; encrypted &gt;
}
SSLRecord {
   type    = 21 (alert)
   version = { 3,0 }
   length  = 18 (0x12)
               &gt; encrypted &gt;
}
]
Server socket closed.
</pre><p>Example 3</p><p>
In this example, the -h option turns hex/ASCII format. There is no SSL parsing or decoding. The output is routed to a text file.
    </p><pre class="programlisting">$ ssltap -h  -p 444 interzone.mcom.com:443 &gt; h.txt</pre><p>Output </p><pre class="programlisting">
Connected to interzone.mcom.com:443
--&gt; [
   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-
]
&lt;-- [
   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
&lt;additional data lines&gt;
]
&lt;additional records in same format&gt;
Server socket closed.
</pre><p>Example 4</p><p>
In this example, the -s option turns on SSL parsing, and the -h option turns on hex/ASCII format. 
Both formats are shown for each record. The output is routed to a text file.
      </p><pre class="programlisting">$ ssltap -hs -p 444 interzone.mcom.com:443 &gt; hs.txt</pre><p>Output </p><pre class="programlisting">
Connected to interzone.mcom.com:443
--&gt; [
   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 }
}
]
&lt;additional records in same formats&gt;
Server socket closed.
</pre></div><div class="refsection"><a name="usage-tips"></a><h2>Usage Tips</h2><p>
When SSL restarts a previous session, it makes use of cached information to do a partial handshake. 
If you wish to capture a full SSL handshake, restart the browser to clear the session id cache.
      </p><p>
If you run the tool on a machine other than the SSL server to which you are trying to connect, 
the browser will complain that the host name you are trying to connect to is different from the certificate. 
If you are using the default BadCert callback, you can still connect through a dialog. If you are not using 
the default BadCert callback, the one you supply must allow for this possibility.
      </p></div><div class="refsection"><a name="seealso"></a><h2>See Also</h2><p>The NSS Security Tools are also documented at <a class="ulink" href="http://www.mozilla.org/projects/security/pki/nss/tools" target="_top">http://www.mozilla.org/projects/security/pki/nss/</a>.</p></div><div class="refsection"><a name="resources"></a><h2>Additional Resources</h2><p>For information about NSS and other tools related to NSS (like JSS), check out the NSS project wiki at <a class="ulink" href="http://www.mozilla.org/projects/security/pki/nss/" target="_top">http://www.mozilla.org/projects/security/pki/nss/</a>. The NSS site relates directly to NSS code changes and releases.</p><p>Mailing lists: https://lists.mozilla.org/listinfo/dev-tech-crypto</p><p>IRC: Freenode at #dogtag-pki</p></div><div class="refsection"><a name="authors"></a><h2>Authors</h2><p>The NSS tools were written and maintained by developers with Netscape, Red Hat,  Sun, Oracle, Mozilla, and Google.</p><p>
	Authors: Elio Maldonado &lt;emaldona@redhat.com&gt;, Deon Lackey &lt;dlackey@redhat.com&gt;.
    </p></div><div class="refsection"><a name="license"></a><h2>LICENSE</h2><p>Licensed under the Mozilla Public License, v. 2.0.  If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
    </p></div></div><div class="navfooter"><hr></div></body></html>