blob: 2a7d6eb32dcceb9b6f84d2a4beaa8524d2e85290 [file] [log] [blame]
Thomas Wouters47b49bf2007-08-30 22:15:33 +00001:mod:`ssl` --- SSL wrapper for socket objects
Georg Brandl7f01a132009-09-16 15:58:14 +00002=============================================
Thomas Woutersed03b412007-08-28 21:37:11 +00003
4.. module:: ssl
Thomas Wouters47b49bf2007-08-30 22:15:33 +00005 :synopsis: SSL wrapper for socket objects
6
7.. moduleauthor:: Bill Janssen <bill.janssen@gmail.com>
Thomas Wouters47b49bf2007-08-30 22:15:33 +00008.. sectionauthor:: Bill Janssen <bill.janssen@gmail.com>
9
Thomas Woutersed03b412007-08-28 21:37:11 +000010
Thomas Wouters1b7f8912007-09-19 03:06:30 +000011.. index:: single: OpenSSL; (use in module ssl)
12
13.. index:: TLS, SSL, Transport Layer Security, Secure Sockets Layer
14
Georg Brandl7f01a132009-09-16 15:58:14 +000015This module provides access to Transport Layer Security (often known as "Secure
16Sockets Layer") encryption and peer authentication facilities for network
17sockets, both client-side and server-side. This module uses the OpenSSL
18library. It is available on all modern Unix systems, Windows, Mac OS X, and
19probably additional platforms, as long as OpenSSL is installed on that platform.
Thomas Woutersed03b412007-08-28 21:37:11 +000020
21.. note::
22
Georg Brandl7f01a132009-09-16 15:58:14 +000023 Some behavior may be platform dependent, since calls are made to the
24 operating system socket APIs. The installed version of OpenSSL may also
25 cause variations in behavior.
Thomas Woutersed03b412007-08-28 21:37:11 +000026
Georg Brandl7f01a132009-09-16 15:58:14 +000027This section documents the objects and functions in the ``ssl`` module; for more
28general information about TLS, SSL, and certificates, the reader is referred to
29the documents in the "See Also" section at the bottom.
Thomas Woutersed03b412007-08-28 21:37:11 +000030
Georg Brandl7f01a132009-09-16 15:58:14 +000031This module provides a class, :class:`ssl.SSLSocket`, which is derived from the
32:class:`socket.socket` type, and provides a socket-like wrapper that also
33encrypts and decrypts the data going over the socket with SSL. It supports
34additional :meth:`read` and :meth:`write` methods, along with a method,
35:meth:`getpeercert`, to retrieve the certificate of the other side of the
36connection, and a method, :meth:`cipher`, to retrieve the cipher being used for
37the secure connection.
Thomas Woutersed03b412007-08-28 21:37:11 +000038
Thomas Wouters1b7f8912007-09-19 03:06:30 +000039Functions, Constants, and Exceptions
40------------------------------------
41
42.. exception:: SSLError
43
Georg Brandl48310cd2009-01-03 21:18:54 +000044 Raised to signal an error from the underlying SSL implementation. This
Georg Brandl7f01a132009-09-16 15:58:14 +000045 signifies some problem in the higher-level encryption and authentication
46 layer that's superimposed on the underlying network connection. This error
47 is a subtype of :exc:`socket.error`, which in turn is a subtype of
48 :exc:`IOError`.
Thomas Wouters1b7f8912007-09-19 03:06:30 +000049
Antoine Pitrou2d9cb9c2010-04-17 17:40:45 +000050.. function:: wrap_socket(sock, keyfile=None, certfile=None, server_side=False, cert_reqs=CERT_NONE, ssl_version={see docs}, ca_certs=None, do_handshake_on_connect=True, suppress_ragged_eofs=True, ciphers=None)
Thomas Wouters1b7f8912007-09-19 03:06:30 +000051
Georg Brandl7f01a132009-09-16 15:58:14 +000052 Takes an instance ``sock`` of :class:`socket.socket`, and returns an instance
53 of :class:`ssl.SSLSocket`, a subtype of :class:`socket.socket`, which wraps
54 the underlying socket in an SSL context. For client-side sockets, the
55 context construction is lazy; if the underlying socket isn't connected yet,
56 the context construction will be performed after :meth:`connect` is called on
57 the socket. For server-side sockets, if the socket has no remote peer, it is
58 assumed to be a listening socket, and the server-side SSL wrapping is
59 automatically performed on client connections accepted via the :meth:`accept`
60 method. :func:`wrap_socket` may raise :exc:`SSLError`.
Thomas Wouters1b7f8912007-09-19 03:06:30 +000061
Georg Brandl7f01a132009-09-16 15:58:14 +000062 The ``keyfile`` and ``certfile`` parameters specify optional files which
63 contain a certificate to be used to identify the local side of the
64 connection. See the discussion of :ref:`ssl-certificates` for more
65 information on how the certificate is stored in the ``certfile``.
Thomas Wouters1b7f8912007-09-19 03:06:30 +000066
Georg Brandl7f01a132009-09-16 15:58:14 +000067 Often the private key is stored in the same file as the certificate; in this
68 case, only the ``certfile`` parameter need be passed. If the private key is
69 stored in a separate file, both parameters must be used. If the private key
70 is stored in the ``certfile``, it should come before the first certificate in
71 the certificate chain::
Thomas Wouters1b7f8912007-09-19 03:06:30 +000072
73 -----BEGIN RSA PRIVATE KEY-----
74 ... (private key in base64 encoding) ...
75 -----END RSA PRIVATE KEY-----
76 -----BEGIN CERTIFICATE-----
77 ... (certificate in base64 PEM encoding) ...
78 -----END CERTIFICATE-----
79
Georg Brandl7f01a132009-09-16 15:58:14 +000080 The parameter ``server_side`` is a boolean which identifies whether
81 server-side or client-side behavior is desired from this socket.
Thomas Wouters1b7f8912007-09-19 03:06:30 +000082
Georg Brandl7f01a132009-09-16 15:58:14 +000083 The parameter ``cert_reqs`` specifies whether a certificate is required from
84 the other side of the connection, and whether it will be validated if
85 provided. It must be one of the three values :const:`CERT_NONE`
86 (certificates ignored), :const:`CERT_OPTIONAL` (not required, but validated
87 if provided), or :const:`CERT_REQUIRED` (required and validated). If the
88 value of this parameter is not :const:`CERT_NONE`, then the ``ca_certs``
89 parameter must point to a file of CA certificates.
Thomas Wouters1b7f8912007-09-19 03:06:30 +000090
Georg Brandl7f01a132009-09-16 15:58:14 +000091 The ``ca_certs`` file contains a set of concatenated "certification
92 authority" certificates, which are used to validate certificates passed from
93 the other end of the connection. See the discussion of
94 :ref:`ssl-certificates` for more information about how to arrange the
95 certificates in this file.
Thomas Wouters1b7f8912007-09-19 03:06:30 +000096
Georg Brandl7f01a132009-09-16 15:58:14 +000097 The parameter ``ssl_version`` specifies which version of the SSL protocol to
98 use. Typically, the server chooses a particular protocol version, and the
99 client must adapt to the server's choice. Most of the versions are not
100 interoperable with the other versions. If not specified, for client-side
101 operation, the default SSL version is SSLv3; for server-side operation,
102 SSLv23. These version selections provide the most compatibility with other
103 versions.
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000104
Georg Brandl7f01a132009-09-16 15:58:14 +0000105 Here's a table showing which versions in a client (down the side) can connect
106 to which versions in a server (along the top):
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000107
108 .. table::
109
110 ======================== ========= ========= ========== =========
111 *client* / **server** **SSLv2** **SSLv3** **SSLv23** **TLSv1**
Christian Heimes255f53b2007-12-08 15:33:56 +0000112 ------------------------ --------- --------- ---------- ---------
Antoine Pitrou2d9cb9c2010-04-17 17:40:45 +0000113 *SSLv2* yes no yes no
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000114 *SSLv3* yes yes yes no
115 *SSLv23* yes no yes no
116 *TLSv1* no no yes yes
117 ======================== ========= ========= ========== =========
118
Antoine Pitrou2d9cb9c2010-04-17 17:40:45 +0000119 .. note::
120
121 This information varies depending on the version of OpenSSL.
122 For instance, in some older versions of OpenSSL (such as 0.9.7l on
123 OS X 10.4), an SSLv2 client could not connect to an SSLv23 server.
124 Conversely, starting from 1.0.0, an SSLv23 client will actually
125 try the SSLv3 protocol unless you explicitly enable SSLv2 ciphers.
126
127 The parameter ``ciphers`` sets the available ciphers for this SSL object.
128 It should be a string in the `OpenSSL cipher list format
129 <http://www.openssl.org/docs/apps/ciphers.html#CIPHER_LIST_FORMAT>`_.
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000130
Bill Janssen48dc27c2007-12-05 03:38:10 +0000131 The parameter ``do_handshake_on_connect`` specifies whether to do the SSL
132 handshake automatically after doing a :meth:`socket.connect`, or whether the
Georg Brandl7f01a132009-09-16 15:58:14 +0000133 application program will call it explicitly, by invoking the
134 :meth:`SSLSocket.do_handshake` method. Calling
135 :meth:`SSLSocket.do_handshake` explicitly gives the program control over the
136 blocking behavior of the socket I/O involved in the handshake.
Bill Janssen48dc27c2007-12-05 03:38:10 +0000137
Georg Brandl7f01a132009-09-16 15:58:14 +0000138 The parameter ``suppress_ragged_eofs`` specifies how the
139 :meth:`SSLSocket.read` method should signal unexpected EOF from the other end
140 of the connection. If specified as :const:`True` (the default), it returns a
141 normal EOF in response to unexpected EOF errors raised from the underlying
142 socket; if :const:`False`, it will raise the exceptions back to the caller.
Bill Janssen48dc27c2007-12-05 03:38:10 +0000143
Ezio Melotti4d5195b2010-04-20 10:57:44 +0000144 .. versionchanged:: 3.2
Antoine Pitrou2d9cb9c2010-04-17 17:40:45 +0000145 New optional argument *ciphers*.
146
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000147.. function:: RAND_status()
148
Georg Brandl7f01a132009-09-16 15:58:14 +0000149 Returns True if the SSL pseudo-random number generator has been seeded with
150 'enough' randomness, and False otherwise. You can use :func:`ssl.RAND_egd`
151 and :func:`ssl.RAND_add` to increase the randomness of the pseudo-random
152 number generator.
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000153
154.. function:: RAND_egd(path)
155
156 If you are running an entropy-gathering daemon (EGD) somewhere, and ``path``
Georg Brandl7f01a132009-09-16 15:58:14 +0000157 is the pathname of a socket connection open to it, this will read 256 bytes
158 of randomness from the socket, and add it to the SSL pseudo-random number
159 generator to increase the security of generated secret keys. This is
160 typically only necessary on systems without better sources of randomness.
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000161
Georg Brandl7f01a132009-09-16 15:58:14 +0000162 See http://egd.sourceforge.net/ or http://prngd.sourceforge.net/ for sources
163 of entropy-gathering daemons.
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000164
165.. function:: RAND_add(bytes, entropy)
166
Georg Brandl7f01a132009-09-16 15:58:14 +0000167 Mixes the given ``bytes`` into the SSL pseudo-random number generator. The
168 parameter ``entropy`` (a float) is a lower bound on the entropy contained in
169 string (so you can always use :const:`0.0`). See :rfc:`1750` for more
170 information on sources of entropy.
Thomas Woutersed03b412007-08-28 21:37:11 +0000171
172.. function:: cert_time_to_seconds(timestring)
173
Georg Brandl7f01a132009-09-16 15:58:14 +0000174 Returns a floating-point value containing a normal seconds-after-the-epoch
175 time value, given the time-string representing the "notBefore" or "notAfter"
176 date from a certificate.
Thomas Woutersed03b412007-08-28 21:37:11 +0000177
178 Here's an example::
179
180 >>> import ssl
181 >>> ssl.cert_time_to_seconds("May 9 00:00:00 2007 GMT")
182 1178694000.0
183 >>> import time
184 >>> time.ctime(ssl.cert_time_to_seconds("May 9 00:00:00 2007 GMT"))
185 'Wed May 9 00:00:00 2007'
Georg Brandl48310cd2009-01-03 21:18:54 +0000186 >>>
Thomas Woutersed03b412007-08-28 21:37:11 +0000187
Georg Brandl7f01a132009-09-16 15:58:14 +0000188.. function:: get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None)
Thomas Woutersed03b412007-08-28 21:37:11 +0000189
Georg Brandl7f01a132009-09-16 15:58:14 +0000190 Given the address ``addr`` of an SSL-protected server, as a (*hostname*,
191 *port-number*) pair, fetches the server's certificate, and returns it as a
192 PEM-encoded string. If ``ssl_version`` is specified, uses that version of
193 the SSL protocol to attempt to connect to the server. If ``ca_certs`` is
194 specified, it should be a file containing a list of root certificates, the
195 same format as used for the same parameter in :func:`wrap_socket`. The call
196 will attempt to validate the server certificate against that set of root
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000197 certificates, and will fail if the validation attempt fails.
198
Georg Brandl7f01a132009-09-16 15:58:14 +0000199.. function:: DER_cert_to_PEM_cert(DER_cert_bytes)
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000200
201 Given a certificate as a DER-encoded blob of bytes, returns a PEM-encoded
202 string version of the same certificate.
203
Georg Brandl7f01a132009-09-16 15:58:14 +0000204.. function:: PEM_cert_to_DER_cert(PEM_cert_string)
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000205
Georg Brandl7f01a132009-09-16 15:58:14 +0000206 Given a certificate as an ASCII PEM string, returns a DER-encoded sequence of
207 bytes for that same certificate.
Thomas Woutersed03b412007-08-28 21:37:11 +0000208
209.. data:: CERT_NONE
210
Georg Brandl7f01a132009-09-16 15:58:14 +0000211 Value to pass to the ``cert_reqs`` parameter to :func:`sslobject` when no
212 certificates will be required or validated from the other side of the socket
213 connection.
Thomas Woutersed03b412007-08-28 21:37:11 +0000214
215.. data:: CERT_OPTIONAL
216
Georg Brandl7f01a132009-09-16 15:58:14 +0000217 Value to pass to the ``cert_reqs`` parameter to :func:`sslobject` when no
218 certificates will be required from the other side of the socket connection,
219 but if they are provided, will be validated. Note that use of this setting
220 requires a valid certificate validation file also be passed as a value of the
221 ``ca_certs`` parameter.
Thomas Woutersed03b412007-08-28 21:37:11 +0000222
223.. data:: CERT_REQUIRED
224
Georg Brandl7f01a132009-09-16 15:58:14 +0000225 Value to pass to the ``cert_reqs`` parameter to :func:`sslobject` when
226 certificates will be required from the other side of the socket connection.
227 Note that use of this setting requires a valid certificate validation file
228 also be passed as a value of the ``ca_certs`` parameter.
Thomas Woutersed03b412007-08-28 21:37:11 +0000229
230.. data:: PROTOCOL_SSLv2
231
232 Selects SSL version 2 as the channel encryption protocol.
233
234.. data:: PROTOCOL_SSLv23
235
Georg Brandl7f01a132009-09-16 15:58:14 +0000236 Selects SSL version 2 or 3 as the channel encryption protocol. This is a
237 setting to use with servers for maximum compatibility with the other end of
238 an SSL connection, but it may cause the specific ciphers chosen for the
239 encryption to be of fairly low quality.
Thomas Woutersed03b412007-08-28 21:37:11 +0000240
241.. data:: PROTOCOL_SSLv3
242
Georg Brandl7f01a132009-09-16 15:58:14 +0000243 Selects SSL version 3 as the channel encryption protocol. For clients, this
244 is the maximally compatible SSL variant.
Thomas Woutersed03b412007-08-28 21:37:11 +0000245
246.. data:: PROTOCOL_TLSv1
247
Georg Brandl7f01a132009-09-16 15:58:14 +0000248 Selects TLS version 1 as the channel encryption protocol. This is the most
249 modern version, and probably the best choice for maximum protection, if both
250 sides can speak it.
Thomas Woutersed03b412007-08-28 21:37:11 +0000251
Antoine Pitrou04f6a322010-04-05 21:40:07 +0000252.. data:: OPENSSL_VERSION
253
254 The version string of the OpenSSL library loaded by the interpreter::
255
256 >>> ssl.OPENSSL_VERSION
257 'OpenSSL 0.9.8k 25 Mar 2009'
258
Antoine Pitrou43a94c312010-04-05 21:44:48 +0000259 .. versionadded:: 3.2
Antoine Pitrou04f6a322010-04-05 21:40:07 +0000260
261.. data:: OPENSSL_VERSION_INFO
262
263 A tuple of five integers representing version information about the
264 OpenSSL library::
265
266 >>> ssl.OPENSSL_VERSION_INFO
267 (0, 9, 8, 11, 15)
268
Antoine Pitrou43a94c312010-04-05 21:44:48 +0000269 .. versionadded:: 3.2
Antoine Pitrou04f6a322010-04-05 21:40:07 +0000270
271.. data:: OPENSSL_VERSION_NUMBER
272
273 The raw version number of the OpenSSL library, as a single integer::
274
275 >>> ssl.OPENSSL_VERSION_NUMBER
Antoine Pitrou43a94c312010-04-05 21:44:48 +0000276 9470143
Antoine Pitrou04f6a322010-04-05 21:40:07 +0000277 >>> hex(ssl.OPENSSL_VERSION_NUMBER)
Antoine Pitrou43a94c312010-04-05 21:44:48 +0000278 '0x9080bf'
Antoine Pitrou04f6a322010-04-05 21:40:07 +0000279
Antoine Pitrou43a94c312010-04-05 21:44:48 +0000280 .. versionadded:: 3.2
Antoine Pitrou04f6a322010-04-05 21:40:07 +0000281
Thomas Woutersed03b412007-08-28 21:37:11 +0000282
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000283SSLSocket Objects
284-----------------
285
Bill Janssen48dc27c2007-12-05 03:38:10 +0000286.. method:: SSLSocket.read(nbytes=1024, buffer=None)
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000287
288 Reads up to ``nbytes`` bytes from the SSL-encrypted channel and returns them.
Georg Brandl7f01a132009-09-16 15:58:14 +0000289 If the ``buffer`` is specified, it will attempt to read into the buffer the
290 minimum of the size of the buffer and ``nbytes``, if that is specified. If
291 no buffer is specified, an immutable buffer is allocated and returned with
292 the data read from the socket.
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000293
294.. method:: SSLSocket.write(data)
295
Georg Brandl7f01a132009-09-16 15:58:14 +0000296 Writes the ``data`` to the other side of the connection, using the SSL
297 channel to encrypt. Returns the number of bytes written.
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000298
Bill Janssen48dc27c2007-12-05 03:38:10 +0000299.. method:: SSLSocket.do_handshake()
300
Georg Brandl7f01a132009-09-16 15:58:14 +0000301 Performs the SSL setup handshake. If the socket is non-blocking, this method
302 may raise :exc:`SSLError` with the value of the exception instance's
303 ``args[0]`` being either :const:`SSL_ERROR_WANT_READ` or
304 :const:`SSL_ERROR_WANT_WRITE`, and should be called again until it stops
305 raising those exceptions. Here's an example of how to do that::
Bill Janssen48dc27c2007-12-05 03:38:10 +0000306
307 while True:
308 try:
309 sock.do_handshake()
310 break
311 except ssl.SSLError as err:
312 if err.args[0] == ssl.SSL_ERROR_WANT_READ:
313 select.select([sock], [], [])
314 elif err.args[0] == ssl.SSL_ERROR_WANT_WRITE:
315 select.select([], [sock], [])
316 else:
317 raise
318
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000319.. method:: SSLSocket.getpeercert(binary_form=False)
320
Georg Brandl7f01a132009-09-16 15:58:14 +0000321 If there is no certificate for the peer on the other end of the connection,
322 returns ``None``.
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000323
Georg Brandl7f01a132009-09-16 15:58:14 +0000324 If the parameter ``binary_form`` is :const:`False`, and a certificate was
325 received from the peer, this method returns a :class:`dict` instance. If the
326 certificate was not validated, the dict is empty. If the certificate was
327 validated, it returns a dict with the keys ``subject`` (the principal for
328 which the certificate was issued), and ``notAfter`` (the time after which the
329 certificate should not be trusted). The certificate was already validated,
330 so the ``notBefore`` and ``issuer`` fields are not returned. If a
331 certificate contains an instance of the *Subject Alternative Name* extension
332 (see :rfc:`3280`), there will also be a ``subjectAltName`` key in the
333 dictionary.
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000334
335 The "subject" field is a tuple containing the sequence of relative
Georg Brandl7f01a132009-09-16 15:58:14 +0000336 distinguished names (RDNs) given in the certificate's data structure for the
337 principal, and each RDN is a sequence of name-value pairs::
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000338
339 {'notAfter': 'Feb 16 16:54:50 2013 GMT',
Ezio Melotti985e24d2009-09-13 07:54:02 +0000340 'subject': ((('countryName', 'US'),),
341 (('stateOrProvinceName', 'Delaware'),),
342 (('localityName', 'Wilmington'),),
343 (('organizationName', 'Python Software Foundation'),),
344 (('organizationalUnitName', 'SSL'),),
345 (('commonName', 'somemachine.python.org'),))}
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000346
Georg Brandl7f01a132009-09-16 15:58:14 +0000347 If the ``binary_form`` parameter is :const:`True`, and a certificate was
348 provided, this method returns the DER-encoded form of the entire certificate
349 as a sequence of bytes, or :const:`None` if the peer did not provide a
350 certificate. This return value is independent of validation; if validation
351 was required (:const:`CERT_OPTIONAL` or :const:`CERT_REQUIRED`), it will have
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000352 been validated, but if :const:`CERT_NONE` was used to establish the
353 connection, the certificate, if present, will not have been validated.
354
355.. method:: SSLSocket.cipher()
356
Georg Brandl7f01a132009-09-16 15:58:14 +0000357 Returns a three-value tuple containing the name of the cipher being used, the
358 version of the SSL protocol that defines its use, and the number of secret
359 bits being used. If no connection has been established, returns ``None``.
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000360
361
Benjamin Peterson4aeec042008-08-19 21:42:13 +0000362.. method:: SSLSocket.unwrap()
363
Georg Brandl7f01a132009-09-16 15:58:14 +0000364 Performs the SSL shutdown handshake, which removes the TLS layer from the
365 underlying socket, and returns the underlying socket object. This can be
366 used to go from encrypted operation over a connection to unencrypted. The
367 returned socket should always be used for further communication with the
368 other side of the connection, rather than the original socket.
Benjamin Peterson4aeec042008-08-19 21:42:13 +0000369
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000370.. index:: single: certificates
371
372.. index:: single: X509 certificate
373
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000374.. _ssl-certificates:
375
Thomas Woutersed03b412007-08-28 21:37:11 +0000376Certificates
377------------
378
Georg Brandl7f01a132009-09-16 15:58:14 +0000379Certificates in general are part of a public-key / private-key system. In this
380system, each *principal*, (which may be a machine, or a person, or an
381organization) is assigned a unique two-part encryption key. One part of the key
382is public, and is called the *public key*; the other part is kept secret, and is
383called the *private key*. The two parts are related, in that if you encrypt a
384message with one of the parts, you can decrypt it with the other part, and
385**only** with the other part.
Thomas Woutersed03b412007-08-28 21:37:11 +0000386
Georg Brandl7f01a132009-09-16 15:58:14 +0000387A certificate contains information about two principals. It contains the name
388of a *subject*, and the subject's public key. It also contains a statement by a
389second principal, the *issuer*, that the subject is who he claims to be, and
390that this is indeed the subject's public key. The issuer's statement is signed
391with the issuer's private key, which only the issuer knows. However, anyone can
392verify the issuer's statement by finding the issuer's public key, decrypting the
393statement with it, and comparing it to the other information in the certificate.
394The certificate also contains information about the time period over which it is
395valid. This is expressed as two fields, called "notBefore" and "notAfter".
Thomas Woutersed03b412007-08-28 21:37:11 +0000396
Georg Brandl7f01a132009-09-16 15:58:14 +0000397In the Python use of certificates, a client or server can use a certificate to
398prove who they are. The other side of a network connection can also be required
399to produce a certificate, and that certificate can be validated to the
400satisfaction of the client or server that requires such validation. The
401connection attempt can be set to raise an exception if the validation fails.
402Validation is done automatically, by the underlying OpenSSL framework; the
403application need not concern itself with its mechanics. But the application
404does usually need to provide sets of certificates to allow this process to take
405place.
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000406
Georg Brandl7f01a132009-09-16 15:58:14 +0000407Python uses files to contain certificates. They should be formatted as "PEM"
408(see :rfc:`1422`), which is a base-64 encoded form wrapped with a header line
409and a footer line::
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000410
411 -----BEGIN CERTIFICATE-----
412 ... (certificate in base64 PEM encoding) ...
413 -----END CERTIFICATE-----
414
Georg Brandl7f01a132009-09-16 15:58:14 +0000415The Python files which contain certificates can contain a sequence of
416certificates, sometimes called a *certificate chain*. This chain should start
417with the specific certificate for the principal who "is" the client or server,
418and then the certificate for the issuer of that certificate, and then the
419certificate for the issuer of *that* certificate, and so on up the chain till
420you get to a certificate which is *self-signed*, that is, a certificate which
421has the same subject and issuer, sometimes called a *root certificate*. The
422certificates should just be concatenated together in the certificate file. For
423example, suppose we had a three certificate chain, from our server certificate
424to the certificate of the certification authority that signed our server
425certificate, to the root certificate of the agency which issued the
426certification authority's certificate::
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000427
428 -----BEGIN CERTIFICATE-----
429 ... (certificate for your server)...
430 -----END CERTIFICATE-----
431 -----BEGIN CERTIFICATE-----
432 ... (the certificate for the CA)...
433 -----END CERTIFICATE-----
434 -----BEGIN CERTIFICATE-----
435 ... (the root certificate for the CA's issuer)...
436 -----END CERTIFICATE-----
437
438If you are going to require validation of the other side of the connection's
439certificate, you need to provide a "CA certs" file, filled with the certificate
Georg Brandl7f01a132009-09-16 15:58:14 +0000440chains for each issuer you are willing to trust. Again, this file just contains
441these chains concatenated together. For validation, Python will use the first
442chain it finds in the file which matches. Some "standard" root certificates are
443available from various certification authorities: `CACert.org
444<http://www.cacert.org/index.php?id=3>`_, `Thawte
445<http://www.thawte.com/roots/>`_, `Verisign
446<http://www.verisign.com/support/roots.html>`_, `Positive SSL
447<http://www.PositiveSSL.com/ssl-certificate-support/cert_installation/UTN-USERFirst-Hardware.crt>`_
448(used by python.org), `Equifax and GeoTrust
449<http://www.geotrust.com/resources/root_certificates/index.asp>`_.
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000450
Georg Brandl7f01a132009-09-16 15:58:14 +0000451In general, if you are using SSL3 or TLS1, you don't need to put the full chain
452in your "CA certs" file; you only need the root certificates, and the remote
453peer is supposed to furnish the other certificates necessary to chain from its
454certificate to a root certificate. See :rfc:`4158` for more discussion of the
455way in which certification chains can be built.
Thomas Woutersed03b412007-08-28 21:37:11 +0000456
Georg Brandl7f01a132009-09-16 15:58:14 +0000457If you are going to create a server that provides SSL-encrypted connection
458services, you will need to acquire a certificate for that service. There are
459many ways of acquiring appropriate certificates, such as buying one from a
460certification authority. Another common practice is to generate a self-signed
461certificate. The simplest way to do this is with the OpenSSL package, using
462something like the following::
Thomas Woutersed03b412007-08-28 21:37:11 +0000463
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000464 % openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout cert.pem
465 Generating a 1024 bit RSA private key
466 .......++++++
467 .............................++++++
468 writing new private key to 'cert.pem'
469 -----
470 You are about to be asked to enter information that will be incorporated
471 into your certificate request.
472 What you are about to enter is what is called a Distinguished Name or a DN.
473 There are quite a few fields but you can leave some blank
474 For some fields there will be a default value,
475 If you enter '.', the field will be left blank.
476 -----
477 Country Name (2 letter code) [AU]:US
478 State or Province Name (full name) [Some-State]:MyState
479 Locality Name (eg, city) []:Some City
480 Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Organization, Inc.
481 Organizational Unit Name (eg, section) []:My Group
482 Common Name (eg, YOUR name) []:myserver.mygroup.myorganization.com
483 Email Address []:ops@myserver.mygroup.myorganization.com
484 %
Thomas Woutersed03b412007-08-28 21:37:11 +0000485
Georg Brandl7f01a132009-09-16 15:58:14 +0000486The disadvantage of a self-signed certificate is that it is its own root
487certificate, and no one else will have it in their cache of known (and trusted)
488root certificates.
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000489
490
Thomas Woutersed03b412007-08-28 21:37:11 +0000491Examples
492--------
493
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000494Testing for SSL support
495^^^^^^^^^^^^^^^^^^^^^^^
496
Georg Brandl7f01a132009-09-16 15:58:14 +0000497To test for the presence of SSL support in a Python installation, user code
498should use the following idiom::
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000499
500 try:
501 import ssl
502 except ImportError:
503 pass
504 else:
505 [ do something that requires SSL support ]
506
507Client-side operation
508^^^^^^^^^^^^^^^^^^^^^
509
Georg Brandl7f01a132009-09-16 15:58:14 +0000510This example connects to an SSL server, prints the server's address and
511certificate, sends some bytes, and reads part of the response::
Thomas Woutersed03b412007-08-28 21:37:11 +0000512
513 import socket, ssl, pprint
514
515 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000516
517 # require a certificate from the server
518 ssl_sock = ssl.wrap_socket(s,
519 ca_certs="/etc/ca_certs_file",
520 cert_reqs=ssl.CERT_REQUIRED)
Thomas Woutersed03b412007-08-28 21:37:11 +0000521
522 ssl_sock.connect(('www.verisign.com', 443))
523
Georg Brandl6911e3c2007-09-04 07:15:32 +0000524 print(repr(ssl_sock.getpeername()))
525 pprint.pprint(ssl_sock.getpeercert())
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000526 print(pprint.pformat(ssl_sock.getpeercert()))
Thomas Woutersed03b412007-08-28 21:37:11 +0000527
Georg Brandl24420152008-05-26 16:32:26 +0000528 # Set a simple HTTP request -- use http.client in actual code.
Thomas Woutersed03b412007-08-28 21:37:11 +0000529 ssl_sock.write("""GET / HTTP/1.0\r
530 Host: www.verisign.com\r\n\r\n""")
531
532 # Read a chunk of data. Will not necessarily
533 # read all the data returned by the server.
534 data = ssl_sock.read()
535
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000536 # note that closing the SSLSocket will also close the underlying socket
Thomas Woutersed03b412007-08-28 21:37:11 +0000537 ssl_sock.close()
538
Georg Brandl7f01a132009-09-16 15:58:14 +0000539As of September 6, 2007, the certificate printed by this program looked like
540this::
Thomas Woutersed03b412007-08-28 21:37:11 +0000541
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000542 {'notAfter': 'May 8 23:59:59 2009 GMT',
Ezio Melotti985e24d2009-09-13 07:54:02 +0000543 'subject': ((('serialNumber', '2497886'),),
544 (('1.3.6.1.4.1.311.60.2.1.3', 'US'),),
545 (('1.3.6.1.4.1.311.60.2.1.2', 'Delaware'),),
546 (('countryName', 'US'),),
547 (('postalCode', '94043'),),
548 (('stateOrProvinceName', 'California'),),
549 (('localityName', 'Mountain View'),),
550 (('streetAddress', '487 East Middlefield Road'),),
551 (('organizationName', 'VeriSign, Inc.'),),
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000552 (('organizationalUnitName',
Ezio Melotti985e24d2009-09-13 07:54:02 +0000553 'Production Security Services'),),
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000554 (('organizationalUnitName',
Ezio Melotti985e24d2009-09-13 07:54:02 +0000555 'Terms of use at www.verisign.com/rpa (c)06'),),
556 (('commonName', 'www.verisign.com'),))}
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000557
558which is a fairly poorly-formed ``subject`` field.
Thomas Woutersed03b412007-08-28 21:37:11 +0000559
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000560Server-side operation
561^^^^^^^^^^^^^^^^^^^^^
562
Georg Brandl7f01a132009-09-16 15:58:14 +0000563For server operation, typically you'd need to have a server certificate, and
564private key, each in a file. You'd open a socket, bind it to a port, call
565:meth:`listen` on it, then start waiting for clients to connect::
Thomas Woutersed03b412007-08-28 21:37:11 +0000566
567 import socket, ssl
568
569 bindsocket = socket.socket()
570 bindsocket.bind(('myaddr.mydomain.com', 10023))
571 bindsocket.listen(5)
572
Georg Brandl7f01a132009-09-16 15:58:14 +0000573When one did, you'd call :meth:`accept` on the socket to get the new socket from
574the other end, and use :func:`wrap_socket` to create a server-side SSL context
575for it::
Thomas Woutersed03b412007-08-28 21:37:11 +0000576
577 while True:
578 newsocket, fromaddr = bindsocket.accept()
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000579 connstream = ssl.wrap_socket(newsocket,
580 server_side=True,
581 certfile="mycertfile",
582 keyfile="mykeyfile",
Christian Heimesdae2a892008-04-19 00:55:37 +0000583 ssl_version=ssl.PROTOCOL_TLSv1)
Thomas Woutersed03b412007-08-28 21:37:11 +0000584 deal_with_client(connstream)
585
Georg Brandl7f01a132009-09-16 15:58:14 +0000586Then you'd read data from the ``connstream`` and do something with it till you
587are finished with the client (or the client is finished with you)::
Thomas Woutersed03b412007-08-28 21:37:11 +0000588
589 def deal_with_client(connstream):
590
591 data = connstream.read()
592 # null data means the client is finished with us
593 while data:
594 if not do_something(connstream, data):
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000595 # we'll assume do_something returns False
596 # when we're finished with client
Thomas Woutersed03b412007-08-28 21:37:11 +0000597 break
598 data = connstream.read()
599 # finished with client
600 connstream.close()
601
602And go back to listening for new client connections.
603
Georg Brandl48310cd2009-01-03 21:18:54 +0000604
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000605.. seealso::
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000606
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000607 Class :class:`socket.socket`
608 Documentation of underlying :mod:`socket` class
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000609
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000610 `Introducing SSL and Certificates using OpenSSL <http://old.pseudonym.org/ssl/wwwj-index.html>`_
611 Frederick J. Hirsch
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000612
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000613 `RFC 1422: Privacy Enhancement for Internet Electronic Mail: Part II: Certificate-Based Key Management <http://www.ietf.org/rfc/rfc1422>`_
614 Steve Kent
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000615
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000616 `RFC 1750: Randomness Recommendations for Security <http://www.ietf.org/rfc/rfc1750>`_
617 D. Eastlake et. al.
Thomas Wouters89d996e2007-09-08 17:39:28 +0000618
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000619 `RFC 3280: Internet X.509 Public Key Infrastructure Certificate and CRL Profile <http://www.ietf.org/rfc/rfc3280>`_
620 Housley et. al.