summaryrefslogtreecommitdiff
path: root/doc/howto.https.html
blob: ee26a19459bfccea0326459d94250f94f10a3839 (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
<HTML
><HEAD
><TITLE
>HOWTO: Programming HTTPS in Python with M2Crypto</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.64
"></HEAD
><BODY
CLASS="ARTICLE"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="ARTICLE"
><DIV
CLASS="TITLEPAGE"
><H1
CLASS="TITLE"
><A
NAME="AEN2"
>HOWTO: Programming HTTPS in Python with M2Crypto</A
></H1
><H3
CLASS="AUTHOR"
><A
NAME="AEN4"
>Pheng Siong Ng</A
></H3
><DIV
CLASS="AFFILIATION"
><DIV
CLASS="ADDRESS"
><P
CLASS="ADDRESS"
>ngps@netmemetic.com</P
></DIV
></DIV
><P
CLASS="COPYRIGHT"
>Copyright &copy; 2001, 2002 by Ng Pheng Siong.</P
><DIV
CLASS="REVHISTORY"
><TABLE
WIDTH="100%"
BORDER="0"
><TR
><TH
ALIGN="LEFT"
VALIGN="TOP"
COLSPAN="3"
><B
>Revision History</B
></TH
></TR
><TR
><TD
ALIGN="LEFT"
>Revision $Revision: 1.1 $</TD
><TD
ALIGN="LEFT"
>$Date: 2003/06/22 16:41:18 $</TD
><TD
ALIGN="LEFT"
></TD
></TR
><TR
><TD
ALIGN="LEFT"
COLSPAN="3"
></TD
></TR
></TABLE
></DIV
><HR></DIV
><DIV
CLASS="SECT1"
><HR><H1
CLASS="SECT1"
><A
NAME="INTRODUCTION"
>Introduction</A
></H1
><P
><A
HREF="http://www.post1.com/home/ngps/m2"
TARGET="_top"
>M2Crypto</A
> 
    is a <A
HREF="http://www.python.org"
TARGET="_top"
>Python</A
>
    interface to <A
HREF="http://www.openssl.org"
TARGET="_top"
>OpenSSL</A
>. It makes 
    available to the Python programmer SSL functionality to implement clients 
    and servers, S/MIME v2, RSA, DSA, DH, symmetric ciphers, message digests and 
    HMACs.
    </P
><P
>This document demonstrates programming HTTPS with M2Crypto.
    </P
></DIV
><DIV
CLASS="SECT1"
><HR><H1
CLASS="SECT1"
><A
NAME="HTTPS"
>Programming HTTPS</A
></H1
>
<P>HTTPS - HTTP over SSL/TLS</P>
<P>Python has had good HTTP support for several years now. M2Crypto's
    HTTPS functionality mostly adopts the interfaces in Python's HTTP modules.
    </P>

    <P>In this HOWTO, we shall begin with writing HTTPS clients. Now, to
    test the HTTPS clients we write, we need a HTTPS server; conversely, to
    test our HTTPS servers, we need a HTTPS client. ;-) </P>

    <P> All the programs we write in this HOWTO are found in
    &lt;m2crypto&gt;/demo/https.howto/. Additionally, a number of programs from
    &lt;m2crypto&gt;/demo/ssl are also copied into this directory; their names are
    prefixed by "orig". These "orig" programs shall be our known-working HTTPS
    clients and servers.  </P>
</DIV
>
<DIV
CLASS="SECT1"
><HR><H1
CLASS="SECT1"
><A
NAME="SSLDUMP"
>ssldump</A
></H1
>
<P>ssldump "is an SSLv3/TLS network protocol analyser. It identifies
    TCP connections on the chosen network interface and attempts to interpret
    them as SSLv3/TLS traffic. When it identifies SSLv3/TLS traffic, it
    decodes the records and displays them in a textual form to stdout. If
    provided with the appropriate keying material, it will also decrypt the
    connections and display the application data traffic.  
    </P>
    
    <P>
    If linked with OpenSSL, ssldump can display certificates in decoded form
    and decrypt traffic (provided that it has the appropriate keying
    material)."
    </P>

    <P>ssldump is written by Eric Rescorla.
    </P>
</DIV
>

<DIV
CLASS="SECT1"
><HR><H1
CLASS="SECT1"
><A
NAME="orig-https-srv.py"
>orig-https-srv.py</A
></H1
>
<P>orig_https_srv.py is an enhanced version of SimpleHTTPServer that
    features the following: 
    </P>
<ul>
<li>Works over HTTPS.
<li>Uses one thread per connection.
<li>Generates directory listings.
<li>Displays SSL handshaking and SSL session info.
<li>Performs SSL renegotiation when a magic URL is requested.
</ul>

<p>Invoke orig_https_srv.py thusly:</p>
<pre>
$ python orig_https_srv.py
</pre>

<p>By default, orig_https_srv.py serves HTTPS on port 9443.</p>

</DIV
>


<DIV
CLASS="SECT1"
><HR><H1
CLASS="SECT1"
><A
NAME="history"
>A bit of history</A
></H1
>

<p> M2Crypto was created during the time of Python 1.5, which features
    a module httplib providing client-side HTTP functionality. M2Crypto sports
    a httpslib based on httplib.
    </p>

    <p>
    Beginning with version 2.0, Python's socket module provided
    (rudimentary) SSL support. Also in the same version, httplib was
    enhanced with class HTTPConnection, which is more sophisticated than
    the old class HTTP, and HTTPSConnection, which does HTTPS.
    </p>

    <p>
    Subsequently, M2Crypto.httpslib grew a compatible (but not identical)
    class HTTPSConnection. 
    </p>
    
    <p>
    The primary interface difference between the two HTTPSConnection
    classes is that M2Crypto's version accepts an M2Crypto.SSL.Context
    instance as a parameter, whereas Python 2.x's SSL support does not
    permit Pythonic control of the SSL context.
    </p>

    <p> Within the implementations, Python's
    <tt>HTTPSConnection</tt> employs a
    <tt>FakeSocket</tt> object, which collects all input from
    the SSL connection before returning it to the application as a
    <tt>StringIO</tt> buffer, whereas M2Crypto's
    <tt>HTTPSConnection</tt> uses a buffering
    <tt>M2Crypto.BIO.IOBuffer</tt> object that works over the
    underlying M2Crypto.SSL.Connection directly.  </p>

</DIV
>


<DIV
CLASS="SECT1"
><HR><H1
CLASS="SECT1"
><A
NAME="simple-post"
>A simple HTTPS-POST client</A
></H1
>


</DIV
>


<DIV
CLASS="SECT1"
><HR><H1
CLASS="SECT1"
><A
NAME="threaded-cli"
>A multi-threaded HTTPS client</A
></H1
>
</DIV
>

<DIV
CLASS="SECT1"
><HR><H1
CLASS="SECT1"
><A
NAME="async-reuse-cli"
>An asynchronous session-reusing client</A
></H1
>
</DIV
>

<DIV
CLASS="SECT1"
><HR><H1
CLASS="SECT1"
><A
NAME="verify-server-cert"
>Verifying server certificate</A
></H1
>
</DIV
>

<DIV
CLASS="SECT1"
><HR><H1
CLASS="SECT1"
><A
NAME="using-client-cert"
>Using client certificate</A
></H1
>
</DIV
>

<DIV
CLASS="SECT1"
><HR><H1
CLASS="SECT1"
><A
NAME="simple-https-server"
>SimpleHTTPSServer</A
></H1
>
</DIV
>

<DIV
CLASS="SECT1"
><HR><H1
CLASS="SECT1"
><A
NAME="medusa-https-server"
>A Medusa-based HTTPS server</A
></H1
>
</DIV
>

<DIV
CLASS="SECT1"
><HR><H1
CLASS="SECT1"
><A
NAME="verify-client-cert"
>Client certificate-based authentication</A
></H1
>
</DIV
>

<DIV
CLASS="SECT1"
><HR><H1
CLASS="SECT1"
><A
NAME="control-session-reuse"
>Controlling session reuse</A
></H1
>
</DIV
>


</BODY
></HTML
>