blob: d700229eca1ca0f8f3481dce803b9b3207d5dc5a [file] [log] [blame]
Thomas Woutersed03b412007-08-28 21:37:11 +00001
Thomas Wouters47b49bf2007-08-30 22:15:33 +00002:mod:`ssl` --- SSL wrapper for socket objects
Thomas Woutersed03b412007-08-28 21:37:11 +00003====================================================================
4
5.. module:: ssl
Thomas Wouters47b49bf2007-08-30 22:15:33 +00006 :synopsis: SSL wrapper for socket objects
7
8.. moduleauthor:: Bill Janssen <bill.janssen@gmail.com>
Thomas Wouters47b49bf2007-08-30 22:15:33 +00009.. sectionauthor:: Bill Janssen <bill.janssen@gmail.com>
10
Thomas Woutersed03b412007-08-28 21:37:11 +000011
Thomas Wouters1b7f8912007-09-19 03:06:30 +000012.. index:: single: OpenSSL; (use in module ssl)
13
14.. index:: TLS, SSL, Transport Layer Security, Secure Sockets Layer
15
Thomas Woutersed03b412007-08-28 21:37:11 +000016This module provides access to Transport Layer Security (often known
17as "Secure Sockets Layer") encryption and peer authentication
18facilities for network sockets, both client-side and server-side.
19This module uses the OpenSSL library. It is available on all modern
20Unix systems, Windows, Mac OS X, and probably additional
21platforms, as long as OpenSSL is installed on that platform.
22
23.. note::
24
25 Some behavior may be platform dependent, since calls are made to the operating
Thomas Wouters1b7f8912007-09-19 03:06:30 +000026 system socket APIs. The installed version of OpenSSL may also cause
27 variations in behavior.
Thomas Woutersed03b412007-08-28 21:37:11 +000028
Thomas Wouters47b49bf2007-08-30 22:15:33 +000029This section documents the objects and functions in the ``ssl`` module;
Thomas Woutersed03b412007-08-28 21:37:11 +000030for more general information about TLS, SSL, and certificates, the
Thomas Wouters1b7f8912007-09-19 03:06:30 +000031reader is referred to the documents in the "See Also" section at
32the bottom.
Thomas Woutersed03b412007-08-28 21:37:11 +000033
Thomas Wouters1b7f8912007-09-19 03:06:30 +000034This module provides a class, :class:`ssl.SSLSocket`, which is
35derived from the :class:`socket.socket` type, and provides
36a socket-like wrapper that also encrypts and decrypts the data
37going over the socket with SSL. It supports additional
Thomas Woutersed03b412007-08-28 21:37:11 +000038:meth:`read` and :meth:`write` methods, along with a method, :meth:`getpeercert`,
Thomas Wouters1b7f8912007-09-19 03:06:30 +000039to retrieve the certificate of the other side of the connection, and
40a method, :meth:`cipher`, to retrieve the cipher being used for the
41secure connection.
Thomas Woutersed03b412007-08-28 21:37:11 +000042
Thomas Wouters1b7f8912007-09-19 03:06:30 +000043Functions, Constants, and Exceptions
44------------------------------------
45
46.. exception:: SSLError
47
48 Raised to signal an error from the underlying SSL implementation. This
49 signifies some problem in the higher-level
50 encryption and authentication layer that's superimposed on the underlying
51 network connection. This error is a subtype of :exc:`socket.error`, which
52 in turn is a subtype of :exc:`IOError`.
53
54.. function:: wrap_socket (sock, keyfile=None, certfile=None, server_side=False, cert_reqs=CERT_NONE, ssl_version={see docs}, ca_certs=None)
55
56 Takes an instance ``sock`` of :class:`socket.socket`, and returns an instance of :class:`ssl.SSLSocket`, a subtype
57 of :class:`socket.socket`, which wraps the underlying socket in an SSL context.
58 For client-side sockets, the context construction is lazy; if the underlying socket isn't
59 connected yet, the context construction will be performed after :meth:`connect` is called
60 on the socket. For server-side sockets, if the socket has no remote peer, it is assumed
61 to be a listening socket, and the server-side SSL wrapping is automatically performed
62 on client connections accepted via the :meth:`accept` method. :func:`wrap_socket` may
63 raise :exc:`SSLError`.
64
65 The ``keyfile`` and ``certfile`` parameters specify optional files which contain a certificate
66 to be used to identify the local side of the connection. See the discussion of :ref:`ssl-certificates`
67 for more information on how the certificate is stored in the ``certfile``.
68
69 Often the private key is stored
70 in the same file as the certificate; in this case, only the ``certfile`` parameter need be
71 passed. If the private key is stored in a separate file, both parameters must be used.
72 If the private key is stored in the ``certfile``, it should come before the first certificate
73 in the certificate chain::
74
75 -----BEGIN RSA PRIVATE KEY-----
76 ... (private key in base64 encoding) ...
77 -----END RSA PRIVATE KEY-----
78 -----BEGIN CERTIFICATE-----
79 ... (certificate in base64 PEM encoding) ...
80 -----END CERTIFICATE-----
81
82 The parameter ``server_side`` is a boolean which identifies whether server-side or client-side
83 behavior is desired from this socket.
84
85 The parameter ``cert_reqs`` specifies whether a certificate is
86 required from the other side of the connection, and whether it will
87 be validated if provided. It must be one of the three values
88 :const:`CERT_NONE` (certificates ignored), :const:`CERT_OPTIONAL` (not required,
89 but validated if provided), or :const:`CERT_REQUIRED` (required and
90 validated). If the value of this parameter is not :const:`CERT_NONE`, then
91 the ``ca_certs`` parameter must point to a file of CA certificates.
92
93 The ``ca_certs`` file contains a set of concatenated "certification authority" certificates,
94 which are used to validate certificates passed from the other end of the connection.
95 See the discussion of :ref:`ssl-certificates` for more information about how to arrange
96 the certificates in this file.
97
98 The parameter ``ssl_version`` specifies which version of the SSL protocol to use.
99 Typically, the server chooses a particular protocol version, and the client
100 must adapt to the server's choice. Most of the versions are not interoperable
101 with the other versions. If not specified, for client-side operation, the
102 default SSL version is SSLv3; for server-side operation, SSLv23. These
103 version selections provide the most compatibility with other versions.
104
105 Here's a table showing which versions in a client (down the side)
106 can connect to which versions in a server (along the top):
107
108 .. table::
109
110 ======================== ========= ========= ========== =========
111 *client* / **server** **SSLv2** **SSLv3** **SSLv23** **TLSv1**
112 *SSLv2* yes no yes* no
113 *SSLv3* yes yes yes no
114 *SSLv23* yes no yes no
115 *TLSv1* no no yes yes
116 ======================== ========= ========= ========== =========
117
118 `*` In some older versions of OpenSSL (for instance, 0.9.7l on OS X 10.4),
119 an SSLv2 client could not connect to an SSLv23 server.
120
121.. function:: RAND_status()
122
123 Returns True if the SSL pseudo-random number generator has been
124 seeded with 'enough' randomness, and False otherwise. You can use
125 :func:`ssl.RAND_egd` and :func:`ssl.RAND_add` to increase the randomness
126 of the pseudo-random number generator.
127
128.. function:: RAND_egd(path)
129
130 If you are running an entropy-gathering daemon (EGD) somewhere, and ``path``
131 is the pathname of a socket connection open to it, this will read
132 256 bytes of randomness from the socket, and add it to the SSL pseudo-random number generator
133 to increase the security of generated secret keys. This is typically only
134 necessary on systems without better sources of randomness.
135
136 See http://egd.sourceforge.net/ or http://prngd.sourceforge.net/ for
137 sources of entropy-gathering daemons.
138
139.. function:: RAND_add(bytes, entropy)
140
141 Mixes the given ``bytes`` into the SSL pseudo-random number generator.
142 The parameter ``entropy`` (a float) is a lower bound on the entropy
143 contained in string (so you can always use :const:`0.0`).
144 See :rfc:`1750` for more information on sources of entropy.
Thomas Woutersed03b412007-08-28 21:37:11 +0000145
146.. function:: cert_time_to_seconds(timestring)
147
148 Returns a floating-point value containing a normal seconds-after-the-epoch time
149 value, given the time-string representing the "notBefore" or "notAfter" date
150 from a certificate.
151
152 Here's an example::
153
154 >>> import ssl
155 >>> ssl.cert_time_to_seconds("May 9 00:00:00 2007 GMT")
156 1178694000.0
157 >>> import time
158 >>> time.ctime(ssl.cert_time_to_seconds("May 9 00:00:00 2007 GMT"))
159 'Wed May 9 00:00:00 2007'
160 >>>
161
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000162.. function:: get_server_certificate (addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None)
Thomas Woutersed03b412007-08-28 21:37:11 +0000163
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000164 Given the address ``addr`` of an SSL-protected server, as a
165 (*hostname*, *port-number*) pair, fetches the server's certificate,
166 and returns it as a PEM-encoded string. If ``ssl_version`` is
167 specified, uses that version of the SSL protocol to attempt to
168 connect to the server. If ``ca_certs`` is specified, it should be
169 a file containing a list of root certificates, the same format as
170 used for the same parameter in :func:`wrap_socket`. The call will
171 attempt to validate the server certificate against that set of root
172 certificates, and will fail if the validation attempt fails.
173
174.. function:: DER_cert_to_PEM_cert (DER_cert_bytes)
175
176 Given a certificate as a DER-encoded blob of bytes, returns a PEM-encoded
177 string version of the same certificate.
178
179.. function:: PEM_cert_to_DER_cert (PEM_cert_string)
180
181 Given a certificate as an ASCII PEM string, returns a DER-encoded
182 sequence of bytes for that same certificate.
Thomas Woutersed03b412007-08-28 21:37:11 +0000183
184.. data:: CERT_NONE
185
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000186 Value to pass to the ``cert_reqs`` parameter to :func:`sslobject`
Thomas Woutersed03b412007-08-28 21:37:11 +0000187 when no certificates will be required or validated from the other
188 side of the socket connection.
189
190.. data:: CERT_OPTIONAL
191
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000192 Value to pass to the ``cert_reqs`` parameter to :func:`sslobject`
Thomas Woutersed03b412007-08-28 21:37:11 +0000193 when no certificates will be required from the other side of the
194 socket connection, but if they are provided, will be validated.
195 Note that use of this setting requires a valid certificate
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000196 validation file also be passed as a value of the ``ca_certs``
Thomas Woutersed03b412007-08-28 21:37:11 +0000197 parameter.
198
199.. data:: CERT_REQUIRED
200
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000201 Value to pass to the ``cert_reqs`` parameter to :func:`sslobject`
Thomas Woutersed03b412007-08-28 21:37:11 +0000202 when certificates will be required from the other side of the
203 socket connection. Note that use of this setting requires a valid certificate
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000204 validation file also be passed as a value of the ``ca_certs``
Thomas Woutersed03b412007-08-28 21:37:11 +0000205 parameter.
206
207.. data:: PROTOCOL_SSLv2
208
209 Selects SSL version 2 as the channel encryption protocol.
210
211.. data:: PROTOCOL_SSLv23
212
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000213 Selects SSL version 2 or 3 as the channel encryption protocol.
214 This is a setting to use with servers for maximum compatibility
215 with the other end of an SSL connection, but it may cause the
216 specific ciphers chosen for the encryption to be of fairly low
217 quality.
Thomas Woutersed03b412007-08-28 21:37:11 +0000218
219.. data:: PROTOCOL_SSLv3
220
221 Selects SSL version 3 as the channel encryption protocol.
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000222 For clients, this is the maximally compatible SSL variant.
Thomas Woutersed03b412007-08-28 21:37:11 +0000223
224.. data:: PROTOCOL_TLSv1
225
Georg Brandl9afde1c2007-11-01 20:32:30 +0000226 Selects TLS version 1 as the channel encryption protocol. This is
Thomas Woutersed03b412007-08-28 21:37:11 +0000227 the most modern version, and probably the best choice for maximum
228 protection, if both sides can speak it.
229
230
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000231SSLSocket Objects
232-----------------
233
234.. method:: SSLSocket.read([nbytes=1024])
235
236 Reads up to ``nbytes`` bytes from the SSL-encrypted channel and returns them.
237
238.. method:: SSLSocket.write(data)
239
240 Writes the ``data`` to the other side of the connection, using the
241 SSL channel to encrypt. Returns the number of bytes written.
242
243.. method:: SSLSocket.getpeercert(binary_form=False)
244
245 If there is no certificate for the peer on the other end of the
246 connection, returns ``None``.
247
248 If the the parameter ``binary_form`` is :const:`False`, and a
249 certificate was received from the peer, this method returns a
250 :class:`dict` instance. If the certificate was not validated, the
251 dict is empty. If the certificate was validated, it returns a dict
252 with the keys ``subject`` (the principal for which the certificate
253 was issued), and ``notAfter`` (the time after which the certificate
254 should not be trusted). The certificate was already validated, so
255 the ``notBefore`` and ``issuer`` fields are not returned. If a
256 certificate contains an instance of the *Subject Alternative Name*
257 extension (see :rfc:`3280`), there will also be a
258 ``subjectAltName`` key in the dictionary.
259
260 The "subject" field is a tuple containing the sequence of relative
261 distinguished names (RDNs) given in the certificate's data
262 structure for the principal, and each RDN is a sequence of
263 name-value pairs::
264
265 {'notAfter': 'Feb 16 16:54:50 2013 GMT',
266 'subject': ((('countryName', u'US'),),
267 (('stateOrProvinceName', u'Delaware'),),
268 (('localityName', u'Wilmington'),),
269 (('organizationName', u'Python Software Foundation'),),
270 (('organizationalUnitName', u'SSL'),),
271 (('commonName', u'somemachine.python.org'),))}
272
273 If the ``binary_form`` parameter is :const:`True`, and a
274 certificate was provided, this method returns the DER-encoded form
275 of the entire certificate as a sequence of bytes, or :const:`None` if the
276 peer did not provide a certificate. This return
277 value is independent of validation; if validation was required
278 (:const:`CERT_OPTIONAL` or :const:`CERT_REQUIRED`), it will have
279 been validated, but if :const:`CERT_NONE` was used to establish the
280 connection, the certificate, if present, will not have been validated.
281
282.. method:: SSLSocket.cipher()
283
284 Returns a three-value tuple containing the name of the cipher being
285 used, the version of the SSL protocol that defines its use, and the
286 number of secret bits being used. If no connection has been
287 established, returns ``None``.
288
289
290.. index:: single: certificates
291
292.. index:: single: X509 certificate
293
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000294.. _ssl-certificates:
295
Thomas Woutersed03b412007-08-28 21:37:11 +0000296Certificates
297------------
298
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000299Certificates in general are part of a public-key / private-key system. In this system, each *principal*,
Thomas Woutersed03b412007-08-28 21:37:11 +0000300(which may be a machine, or a person, or an organization) is assigned a unique two-part encryption key.
301One part of the key is public, and is called the *public key*; the other part is kept secret, and is called
302the *private key*. The two parts are related, in that if you encrypt a message with one of the parts, you can
303decrypt it with the other part, and **only** with the other part.
304
305A certificate contains information about two principals. It contains
306the name of a *subject*, and the subject's public key. It also
307contains a statement by a second principal, the *issuer*, that the
308subject is who he claims to be, and that this is indeed the subject's
309public key. The issuer's statement is signed with the issuer's
310private key, which only the issuer knows. However, anyone can verify
311the issuer's statement by finding the issuer's public key, decrypting
312the statement with it, and comparing it to the other information in
313the certificate. The certificate also contains information about the
314time period over which it is valid. This is expressed as two fields,
315called "notBefore" and "notAfter".
316
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000317In the Python use of certificates, a client or server
318can use a certificate to prove who they are. The other
319side of a network connection can also be required to produce a certificate,
320and that certificate can be validated to the satisfaction
321of the client or server that requires such validation.
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000322The connection attempt can be set to raise an exception if
323the validation fails. Validation is done
324automatically, by the underlying OpenSSL framework; the
325application need not concern itself with its mechanics.
326But the application does usually need to provide
327sets of certificates to allow this process to take place.
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000328
329Python uses files to contain certificates. They should be formatted
330as "PEM" (see :rfc:`1422`), which is a base-64 encoded form wrapped
331with a header line and a footer line::
332
333 -----BEGIN CERTIFICATE-----
334 ... (certificate in base64 PEM encoding) ...
335 -----END CERTIFICATE-----
336
337The Python files which contain certificates can contain a sequence
338of certificates, sometimes called a *certificate chain*. This chain
339should start with the specific certificate for the principal who "is"
340the client or server, and then the certificate for the issuer of that
341certificate, and then the certificate for the issuer of *that* certificate,
342and so on up the chain till you get to a certificate which is *self-signed*,
343that is, a certificate which has the same subject and issuer,
344sometimes called a *root certificate*. The certificates should just
345be concatenated together in the certificate file. For example, suppose
346we had a three certificate chain, from our server certificate to the
347certificate of the certification authority that signed our server certificate,
348to the root certificate of the agency which issued the certification authority's
349certificate::
350
351 -----BEGIN CERTIFICATE-----
352 ... (certificate for your server)...
353 -----END CERTIFICATE-----
354 -----BEGIN CERTIFICATE-----
355 ... (the certificate for the CA)...
356 -----END CERTIFICATE-----
357 -----BEGIN CERTIFICATE-----
358 ... (the root certificate for the CA's issuer)...
359 -----END CERTIFICATE-----
360
361If you are going to require validation of the other side of the connection's
362certificate, you need to provide a "CA certs" file, filled with the certificate
363chains for each issuer you are willing to trust. Again, this file just
364contains these chains concatenated together. For validation, Python will
365use the first chain it finds in the file which matches.
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000366Some "standard" root certificates are available from various certification
367authorities:
368`CACert.org <http://www.cacert.org/index.php?id=3>`_,
369`Thawte <http://www.thawte.com/roots/>`_,
370`Verisign <http://www.verisign.com/support/roots.html>`_,
371`Positive SSL <http://www.PositiveSSL.com/ssl-certificate-support/cert_installation/UTN-USERFirst-Hardware.crt>`_ (used by python.org),
372`Equifax and GeoTrust <http://www.geotrust.com/resources/root_certificates/index.asp>`_.
373
374In general, if you are using
375SSL3 or TLS1, you don't need to put the full chain in your "CA certs" file;
376you only need the root certificates, and the remote peer is supposed to
377furnish the other certificates necessary to chain from its certificate to
378a root certificate.
379See :rfc:`4158` for more discussion of the way in which
Thomas Wouters89d996e2007-09-08 17:39:28 +0000380certification chains can be built.
Thomas Woutersed03b412007-08-28 21:37:11 +0000381
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000382If you are going to create a server that provides SSL-encrypted
383connection services, you will need to acquire a certificate for that
384service. There are many ways of acquiring appropriate certificates,
385such as buying one from a certification authority. Another common
386practice is to generate a self-signed certificate. The simplest
387way to do this is with the OpenSSL package, using something like
388the following::
Thomas Woutersed03b412007-08-28 21:37:11 +0000389
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000390 % openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout cert.pem
391 Generating a 1024 bit RSA private key
392 .......++++++
393 .............................++++++
394 writing new private key to 'cert.pem'
395 -----
396 You are about to be asked to enter information that will be incorporated
397 into your certificate request.
398 What you are about to enter is what is called a Distinguished Name or a DN.
399 There are quite a few fields but you can leave some blank
400 For some fields there will be a default value,
401 If you enter '.', the field will be left blank.
402 -----
403 Country Name (2 letter code) [AU]:US
404 State or Province Name (full name) [Some-State]:MyState
405 Locality Name (eg, city) []:Some City
406 Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Organization, Inc.
407 Organizational Unit Name (eg, section) []:My Group
408 Common Name (eg, YOUR name) []:myserver.mygroup.myorganization.com
409 Email Address []:ops@myserver.mygroup.myorganization.com
410 %
Thomas Woutersed03b412007-08-28 21:37:11 +0000411
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000412The disadvantage of a self-signed certificate is that it is its
413own root certificate, and no one else will have it in their cache
414of known (and trusted) root certificates.
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000415
416
Thomas Woutersed03b412007-08-28 21:37:11 +0000417Examples
418--------
419
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000420Testing for SSL support
421^^^^^^^^^^^^^^^^^^^^^^^
422
423To test for the presence of SSL support in a Python installation, user code should use the following idiom::
424
425 try:
426 import ssl
427 except ImportError:
428 pass
429 else:
430 [ do something that requires SSL support ]
431
432Client-side operation
433^^^^^^^^^^^^^^^^^^^^^
434
Thomas Woutersed03b412007-08-28 21:37:11 +0000435This example connects to an SSL server, prints the server's address and certificate,
436sends some bytes, and reads part of the response::
437
438 import socket, ssl, pprint
439
440 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000441
442 # require a certificate from the server
443 ssl_sock = ssl.wrap_socket(s,
444 ca_certs="/etc/ca_certs_file",
445 cert_reqs=ssl.CERT_REQUIRED)
Thomas Woutersed03b412007-08-28 21:37:11 +0000446
447 ssl_sock.connect(('www.verisign.com', 443))
448
Georg Brandl6911e3c2007-09-04 07:15:32 +0000449 print(repr(ssl_sock.getpeername()))
450 pprint.pprint(ssl_sock.getpeercert())
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000451 print(pprint.pformat(ssl_sock.getpeercert()))
Thomas Woutersed03b412007-08-28 21:37:11 +0000452
453 # Set a simple HTTP request -- use httplib in actual code.
454 ssl_sock.write("""GET / HTTP/1.0\r
455 Host: www.verisign.com\r\n\r\n""")
456
457 # Read a chunk of data. Will not necessarily
458 # read all the data returned by the server.
459 data = ssl_sock.read()
460
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000461 # note that closing the SSLSocket will also close the underlying socket
Thomas Woutersed03b412007-08-28 21:37:11 +0000462 ssl_sock.close()
463
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000464As of September 6, 2007, the certificate printed by this program
Thomas Woutersed03b412007-08-28 21:37:11 +0000465looked like this::
466
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000467 {'notAfter': 'May 8 23:59:59 2009 GMT',
468 'subject': ((('serialNumber', u'2497886'),),
469 (('1.3.6.1.4.1.311.60.2.1.3', u'US'),),
470 (('1.3.6.1.4.1.311.60.2.1.2', u'Delaware'),),
471 (('countryName', u'US'),),
472 (('postalCode', u'94043'),),
473 (('stateOrProvinceName', u'California'),),
474 (('localityName', u'Mountain View'),),
475 (('streetAddress', u'487 East Middlefield Road'),),
476 (('organizationName', u'VeriSign, Inc.'),),
477 (('organizationalUnitName',
478 u'Production Security Services'),),
479 (('organizationalUnitName',
480 u'Terms of use at www.verisign.com/rpa (c)06'),),
481 (('commonName', u'www.verisign.com'),))}
482
483which is a fairly poorly-formed ``subject`` field.
Thomas Woutersed03b412007-08-28 21:37:11 +0000484
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000485Server-side operation
486^^^^^^^^^^^^^^^^^^^^^
487
Thomas Woutersed03b412007-08-28 21:37:11 +0000488For server operation, typically you'd need to have a server certificate, and private key, each in a file.
489You'd open a socket, bind it to a port, call :meth:`listen` on it, then start waiting for clients
490to connect::
491
492 import socket, ssl
493
494 bindsocket = socket.socket()
495 bindsocket.bind(('myaddr.mydomain.com', 10023))
496 bindsocket.listen(5)
497
498When one did, you'd call :meth:`accept` on the socket to get the new socket from the other
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000499end, and use :func:`wrap_socket` to create a server-side SSL context for it::
Thomas Woutersed03b412007-08-28 21:37:11 +0000500
501 while True:
502 newsocket, fromaddr = bindsocket.accept()
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000503 connstream = ssl.wrap_socket(newsocket,
504 server_side=True,
505 certfile="mycertfile",
506 keyfile="mykeyfile",
507 ssl_protocol=ssl.PROTOCOL_TLSv1)
Thomas Woutersed03b412007-08-28 21:37:11 +0000508 deal_with_client(connstream)
509
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000510Then you'd read data from the ``connstream`` and do something with it till you are finished with the client (or the client is finished with you)::
Thomas Woutersed03b412007-08-28 21:37:11 +0000511
512 def deal_with_client(connstream):
513
514 data = connstream.read()
515 # null data means the client is finished with us
516 while data:
517 if not do_something(connstream, data):
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000518 # we'll assume do_something returns False
519 # when we're finished with client
Thomas Woutersed03b412007-08-28 21:37:11 +0000520 break
521 data = connstream.read()
522 # finished with client
523 connstream.close()
524
525And go back to listening for new client connections.
526
527
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000528.. seealso::
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000529
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000530 Class :class:`socket.socket`
531 Documentation of underlying :mod:`socket` class
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000532
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000533 `Introducing SSL and Certificates using OpenSSL <http://old.pseudonym.org/ssl/wwwj-index.html>`_
534 Frederick J. Hirsch
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000535
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000536 `RFC 1422: Privacy Enhancement for Internet Electronic Mail: Part II: Certificate-Based Key Management <http://www.ietf.org/rfc/rfc1422>`_
537 Steve Kent
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000538
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000539 `RFC 1750: Randomness Recommendations for Security <http://www.ietf.org/rfc/rfc1750>`_
540 D. Eastlake et. al.
Thomas Wouters89d996e2007-09-08 17:39:28 +0000541
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000542 `RFC 3280: Internet X.509 Public Key Infrastructure Certificate and CRL Profile <http://www.ietf.org/rfc/rfc3280>`_
543 Housley et. al.