blob: 1074a33be168880885824726c043b6ab761b8f6e [file] [log] [blame]
Guido van Rossum8ee23bb2007-08-27 19:11:11 +00001
Bill Janssen426ea0a2007-08-29 22:35:05 +00002:mod:`ssl` --- SSL wrapper for socket objects
Guido van Rossum8ee23bb2007-08-27 19:11:11 +00003====================================================================
4
5.. module:: ssl
Bill Janssen426ea0a2007-08-29 22:35:05 +00006 :synopsis: SSL wrapper for socket objects
7
8.. moduleauthor:: Bill Janssen <bill.janssen@gmail.com>
Guido van Rossum8ee23bb2007-08-27 19:11:11 +00009
10.. versionadded:: 2.6
11
Bill Janssen426ea0a2007-08-29 22:35:05 +000012.. sectionauthor:: Bill Janssen <bill.janssen@gmail.com>
13
Guido van Rossum8ee23bb2007-08-27 19:11:11 +000014
Bill Janssen98d19da2007-09-10 21:51:02 +000015.. index:: single: OpenSSL; (use in module ssl)
16
17.. index:: TLS, SSL, Transport Layer Security, Secure Sockets Layer
18
Guido van Rossum8ee23bb2007-08-27 19:11:11 +000019This module provides access to Transport Layer Security (often known
20as "Secure Sockets Layer") encryption and peer authentication
21facilities for network sockets, both client-side and server-side.
22This module uses the OpenSSL library. It is available on all modern
23Unix systems, Windows, Mac OS X, and probably additional
24platforms, as long as OpenSSL is installed on that platform.
25
26.. note::
27
28 Some behavior may be platform dependent, since calls are made to the operating
Bill Janssen98d19da2007-09-10 21:51:02 +000029 system socket APIs. The installed version of OpenSSL may also cause
30 variations in behavior.
Guido van Rossum8ee23bb2007-08-27 19:11:11 +000031
Bill Janssen426ea0a2007-08-29 22:35:05 +000032This section documents the objects and functions in the ``ssl`` module;
Guido van Rossum8ee23bb2007-08-27 19:11:11 +000033for more general information about TLS, SSL, and certificates, the
Bill Janssen98d19da2007-09-10 21:51:02 +000034reader is referred to the documents in the "See Also" section at
35the bottom.
Guido van Rossum8ee23bb2007-08-27 19:11:11 +000036
Bill Janssen98d19da2007-09-10 21:51:02 +000037This module defines a class, :class:`ssl.SSLSocket`, which is
Guido van Rossum8ee23bb2007-08-27 19:11:11 +000038derived from the :class:`socket.socket` type, and supports additional
39:meth:`read` and :meth:`write` methods, along with a method, :meth:`getpeercert`,
40to retrieve the certificate of the other side of the connection.
41
42This module defines the following functions, exceptions, and constants:
43
Bill Janssen98d19da2007-09-10 21:51:02 +000044.. function:: wrap_socket (sock [, keyfile=None, certfile=None, server_side=False,
45 cert_reqs=CERT_NONE, ssl_version={see docs}, ca_certs=None])
46
47 Takes an instance ``sock`` of :class:`socket.socket`, and returns an instance of :class:`ssl.SSLSocket`, a subtype
48 of :class:`socket.socket`, which wraps the underlying socket in an SSL context.
49 For client-side sockets, the context construction is lazy; if the underlying socket isn't
50 connected yet, the context construction will be performed after :meth:`connect` is called
51 on the socket. For server-side sockets, if the socket has no remote peer, it is assumed
52 to be a listening socket, and the server-side SSL wrapping is automatically performed
53 on client connections accepted via the :meth:`accept` method.
54
55 The ``keyfile`` and ``certfile`` parameters specify optional files which contain a certificate
56 to be used to identify the local side of the connection. See the discussion of :ref:`ssl-certificates`
57 for more information on how the certificate is stored in the ``certfile``.
58
59 Often the private key is stored
60 in the same file as the certificate; in this case, only the ``certfile`` parameter need be
61 passed. If the private key is stored in a separate file, both parameters must be used.
62 If the private key is stored in the ``certfile``, it should come before the first certificate
63 in the certificate chain::
64
65 -----BEGIN RSA PRIVATE KEY-----
66 ... (private key in base64 encoding) ...
67 -----END RSA PRIVATE KEY-----
68 -----BEGIN CERTIFICATE-----
69 ... (certificate in base64 PEM encoding) ...
70 -----END CERTIFICATE-----
71
72 The parameter ``server_side`` is a boolean which identifies whether server-side or client-side
73 behavior is desired from this socket.
74
75 The parameter ``cert_reqs`` specifies whether a certificate is
76 required from the other side of the connection, and whether it will
77 be validated if provided. It must be one of the three values
78 :const:`CERT_NONE` (certificates ignored), :const:`CERT_OPTIONAL` (not required,
79 but validated if provided), or :const:`CERT_REQUIRED` (required and
80 validated). If the value of this parameter is not :const:`CERT_NONE`, then
81 the ``ca_certs`` parameter must point to a file of CA certificates.
82
83 The ``ca_certs`` file contains a set of concatenated "certification authority" certificates,
84 which are used to validate certificates passed from the other end of the connection.
85 See the discussion of :ref:`ssl-certificates` for more information about how to arrange
86 the certificates in this file.
87
88 The parameter ``ssl_version`` specifies which version of the SSL protocol to use.
89 Typically, the server chooses a particular protocol version, and the client
90 must adapt to the server's choice. Most of the versions are not interoperable
91 with the other versions. If not specified, for client-side operation, the
92 default SSL version is SSLv3; for server-side operation, SSLv23. These
93 version selections provide the most compatibility with other versions.
94
95 Here's a table showing which versions in a client (down the side)
96 can connect to which versions in a server (along the top):
97
98 .. table::
99
100 ======================== ========= ========= ========== =========
101 *client* / **server** **SSLv2** **SSLv3** **SSLv23** **TLSv1**
102 *SSLv2* yes no yes* no
103 *SSLv3* yes yes yes no
104 *SSLv23* yes no yes no
105 *TLSv1* no no yes yes
106 ======================== ========= ========= ========== =========
107
108 `*` In some older versions of OpenSSL (for instance, 0.9.7l on OS X 10.4),
109 an SSLv2 client could not connect to an SSLv23 server.
110
111.. function:: RAND_status()
112
113 Returns True if the SSL pseudo-random number generator has been
114 seeded with 'enough' randomness, and False otherwise. You can use
115 :func:`ssl.RAND_egd` and :func:`ssl.RAND_add` to increase the randomness
116 of the pseudo-random number generator.
117
118.. function:: RAND_egd(path)
119
120 If you are running an entropy-gathering daemon (EGD) somewhere, and ``path``
121 is the pathname of a socket connection open to it, this will read
122 256 bytes of randomness from the socket, and add it to the SSL pseudo-random number generator
123 to increase the security of generated secret keys. This is typically only
124 necessary on systems without better sources of randomness.
125
126 See http://egd.sourceforge.net/ or http://prngd.sourceforge.net/ for
127 sources of EGDs.
128
129.. function:: RAND_add(bytes, entropy)
130
131 Mixes the given ``bytes`` into the SSL pseudo-random number generator.
132 The parameter ``entropy`` (a float) is a lower bound on the entropy
133 contained in string (so you can always use :const:`0.0`).
134 See :rfc:`1750` for more information on sources of entropy.
135
Guido van Rossum8ee23bb2007-08-27 19:11:11 +0000136.. function:: cert_time_to_seconds(timestring)
137
138 Returns a floating-point value containing a normal seconds-after-the-epoch time
139 value, given the time-string representing the "notBefore" or "notAfter" date
140 from a certificate.
141
142 Here's an example::
143
144 >>> import ssl
145 >>> ssl.cert_time_to_seconds("May 9 00:00:00 2007 GMT")
146 1178694000.0
147 >>> import time
148 >>> time.ctime(ssl.cert_time_to_seconds("May 9 00:00:00 2007 GMT"))
149 'Wed May 9 00:00:00 2007'
150 >>>
151
Bill Janssen98d19da2007-09-10 21:51:02 +0000152.. exception:: SSLError
Guido van Rossum8ee23bb2007-08-27 19:11:11 +0000153
154 Raised to signal an error from the underlying SSL implementation. This
155 signifies some problem in the higher-level
156 encryption and authentication layer that's superimposed on the underlying
157 network connection.
158
159.. data:: CERT_NONE
160
Bill Janssen426ea0a2007-08-29 22:35:05 +0000161 Value to pass to the ``cert_reqs`` parameter to :func:`sslobject`
Guido van Rossum8ee23bb2007-08-27 19:11:11 +0000162 when no certificates will be required or validated from the other
163 side of the socket connection.
164
165.. data:: CERT_OPTIONAL
166
Bill Janssen426ea0a2007-08-29 22:35:05 +0000167 Value to pass to the ``cert_reqs`` parameter to :func:`sslobject`
Guido van Rossum8ee23bb2007-08-27 19:11:11 +0000168 when no certificates will be required from the other side of the
169 socket connection, but if they are provided, will be validated.
170 Note that use of this setting requires a valid certificate
Bill Janssen426ea0a2007-08-29 22:35:05 +0000171 validation file also be passed as a value of the ``ca_certs``
Guido van Rossum8ee23bb2007-08-27 19:11:11 +0000172 parameter.
173
174.. data:: CERT_REQUIRED
175
Bill Janssen426ea0a2007-08-29 22:35:05 +0000176 Value to pass to the ``cert_reqs`` parameter to :func:`sslobject`
Guido van Rossum8ee23bb2007-08-27 19:11:11 +0000177 when certificates will be required from the other side of the
178 socket connection. Note that use of this setting requires a valid certificate
Bill Janssen426ea0a2007-08-29 22:35:05 +0000179 validation file also be passed as a value of the ``ca_certs``
Guido van Rossum8ee23bb2007-08-27 19:11:11 +0000180 parameter.
181
182.. data:: PROTOCOL_SSLv2
183
184 Selects SSL version 2 as the channel encryption protocol.
185
186.. data:: PROTOCOL_SSLv23
187
188 Selects SSL version 2 or 3 as the channel encryption protocol. This is a setting to use for maximum compatibility
189 with the other end of an SSL connection, but it may cause the specific ciphers chosen for the encryption to be
190 of fairly low quality.
191
192.. data:: PROTOCOL_SSLv3
193
194 Selects SSL version 3 as the channel encryption protocol.
195
196.. data:: PROTOCOL_TLSv1
197
198 Selects SSL version 2 as the channel encryption protocol. This is
199 the most modern version, and probably the best choice for maximum
200 protection, if both sides can speak it.
201
202
Bill Janssen426ea0a2007-08-29 22:35:05 +0000203.. _ssl-certificates:
204
Bill Janssen98d19da2007-09-10 21:51:02 +0000205SSLSocket Objects
206-----------------
207
208.. method:: SSLSocket.read([nbytes=1024])
209
210 Reads up to ``nbytes`` bytes from the SSL-encrypted channel and returns them.
211
212.. method:: SSLSocket.write(data)
213
214 Writes the ``data`` to the other side of the connection, using the SSL channel to encrypt. Returns the number
215 of bytes written.
216
217.. method:: SSLSocket.getpeercert()
218
219 If there is no certificate for the peer on the other end of the connection, returns ``None``.
220 If a certificate was received from the peer, but not validated, returns an empty ``dict`` instance.
221 If a certificate was received and validated, returns a ``dict`` instance with the fields
222 ``subject`` (the principal for which the certificate was issued),
223 and ``notAfter`` (the time after which the certificate should not be trusted) filled in.
224 The certificate was already validated, so the ``notBefore`` and ``issuer`` fields are not
225 returned. If a certificate contains an instance of the *subjectAltName* extension,
226 there will also be a ``subjectAltName`` field in the dictionary.
227
228 The "subject" field is a tuple containing the sequence
229 of relative distinguished names (RDNs) given in the certificate's data structure
230 for the principal, and each RDN is a sequence of name-value pairs::
231
232 {'notAfter': 'Feb 16 16:54:50 2013 GMT',
233 'subject': ((('countryName', u'US'),),
234 (('stateOrProvinceName', u'Delaware'),),
235 (('localityName', u'Wilmington'),),
236 (('organizationName', u'Python Software Foundation'),),
237 (('organizationalUnitName', u'SSL'),),
238 (('commonName', u'somemachine.python.org'),))}
239
240
241.. method:: SSLSocket.cipher()
242
243 Returns a three-value tuple containing the name of the cipher being
244 used, the version of the SSL protocol that defines its use, and the
245 number of secret bits being used. If no connection has been
246 established, returns ``None``.
247
248.. method:: SSLSocket.ssl_shutdown()
249
250 Closes the SSL context (if any) over the socket, but leaves the socket connection
251 open for further use, if both sides are willing. This is different from :meth:`socket.socket.shutdown`,
252 which will close the connection, but leave the local socket available for further use.
253
254
255.. index:: single: certificates
256
257.. index:: single: X509 certificate
258
Guido van Rossum8ee23bb2007-08-27 19:11:11 +0000259Certificates
260------------
261
Bill Janssen426ea0a2007-08-29 22:35:05 +0000262Certificates in general are part of a public-key / private-key system. In this system, each *principal*,
Guido van Rossum8ee23bb2007-08-27 19:11:11 +0000263(which may be a machine, or a person, or an organization) is assigned a unique two-part encryption key.
264One part of the key is public, and is called the *public key*; the other part is kept secret, and is called
265the *private key*. The two parts are related, in that if you encrypt a message with one of the parts, you can
266decrypt it with the other part, and **only** with the other part.
267
268A certificate contains information about two principals. It contains
269the name of a *subject*, and the subject's public key. It also
270contains a statement by a second principal, the *issuer*, that the
271subject is who he claims to be, and that this is indeed the subject's
272public key. The issuer's statement is signed with the issuer's
273private key, which only the issuer knows. However, anyone can verify
274the issuer's statement by finding the issuer's public key, decrypting
275the statement with it, and comparing it to the other information in
276the certificate. The certificate also contains information about the
277time period over which it is valid. This is expressed as two fields,
278called "notBefore" and "notAfter".
279
Bill Janssen426ea0a2007-08-29 22:35:05 +0000280In the Python use of certificates, a client or server
281can use a certificate to prove who they are. The other
282side of a network connection can also be required to produce a certificate,
283and that certificate can be validated to the satisfaction
284of the client or server that requires such validation.
Bill Janssen98d19da2007-09-10 21:51:02 +0000285The connection attempt can be set to raise an exception if
286the validation fails. Validation is done
287automatically, by the underlying OpenSSL framework; the
288application need not concern itself with its mechanics.
289But the application does usually need to provide
290sets of certificates to allow this process to take place.
Bill Janssen426ea0a2007-08-29 22:35:05 +0000291
292Python uses files to contain certificates. They should be formatted
293as "PEM" (see :rfc:`1422`), which is a base-64 encoded form wrapped
294with a header line and a footer line::
295
296 -----BEGIN CERTIFICATE-----
297 ... (certificate in base64 PEM encoding) ...
298 -----END CERTIFICATE-----
299
300The Python files which contain certificates can contain a sequence
301of certificates, sometimes called a *certificate chain*. This chain
302should start with the specific certificate for the principal who "is"
303the client or server, and then the certificate for the issuer of that
304certificate, and then the certificate for the issuer of *that* certificate,
305and so on up the chain till you get to a certificate which is *self-signed*,
306that is, a certificate which has the same subject and issuer,
307sometimes called a *root certificate*. The certificates should just
308be concatenated together in the certificate file. For example, suppose
309we had a three certificate chain, from our server certificate to the
310certificate of the certification authority that signed our server certificate,
311to the root certificate of the agency which issued the certification authority's
312certificate::
313
314 -----BEGIN CERTIFICATE-----
315 ... (certificate for your server)...
316 -----END CERTIFICATE-----
317 -----BEGIN CERTIFICATE-----
318 ... (the certificate for the CA)...
319 -----END CERTIFICATE-----
320 -----BEGIN CERTIFICATE-----
321 ... (the root certificate for the CA's issuer)...
322 -----END CERTIFICATE-----
323
324If you are going to require validation of the other side of the connection's
325certificate, you need to provide a "CA certs" file, filled with the certificate
326chains for each issuer you are willing to trust. Again, this file just
327contains these chains concatenated together. For validation, Python will
328use the first chain it finds in the file which matches.
Bill Janssen98d19da2007-09-10 21:51:02 +0000329Some "standard" root certificates are available from various certification
330authorities:
331`CACert.org <http://www.cacert.org/index.php?id=3>`_,
332`Thawte <http://www.thawte.com/roots/>`_,
333`Verisign <http://www.verisign.com/support/roots.html>`_,
334`Equifax and GeoTrust <http://www.geotrust.com/resources/root_certificates/index.asp>`_.
335
336In general, if you are using
337SSL3 or TLS1, you don't need to put the full chain in your "CA certs" file;
338you only need the root certificates, and the remote peer is supposed to
339furnish the other certificates necessary to chain from its certificate to
340a root certificate.
341See :rfc:`4158` for more discussion of the way in which
Bill Janssenffe576d2007-09-05 00:46:27 +0000342certification chains can be built.
Guido van Rossum8ee23bb2007-08-27 19:11:11 +0000343
Bill Janssen98d19da2007-09-10 21:51:02 +0000344If you are going to create a server that provides SSL-encrypted
345connection services, you will need to acquire a certificate for that
346service. There are many ways of acquiring appropriate certificates,
347such as buying one from a certification authority. Another common
348practice is to generate a self-signed certificate. The simplest
349way to do this is with the OpenSSL package, using something like
350the following::
Guido van Rossum8ee23bb2007-08-27 19:11:11 +0000351
Bill Janssen98d19da2007-09-10 21:51:02 +0000352 % openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout cert.pem
353 Generating a 1024 bit RSA private key
354 .......++++++
355 .............................++++++
356 writing new private key to 'cert.pem'
357 -----
358 You are about to be asked to enter information that will be incorporated
359 into your certificate request.
360 What you are about to enter is what is called a Distinguished Name or a DN.
361 There are quite a few fields but you can leave some blank
362 For some fields there will be a default value,
363 If you enter '.', the field will be left blank.
364 -----
365 Country Name (2 letter code) [AU]:US
366 State or Province Name (full name) [Some-State]:MyState
367 Locality Name (eg, city) []:Some City
368 Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Organization, Inc.
369 Organizational Unit Name (eg, section) []:My Group
370 Common Name (eg, YOUR name) []:myserver.mygroup.myorganization.com
371 Email Address []:ops@myserver.mygroup.myorganization.com
372 %
Guido van Rossum8ee23bb2007-08-27 19:11:11 +0000373
Bill Janssen98d19da2007-09-10 21:51:02 +0000374The disadvantage of a self-signed certificate is that it is its
375own root certificate, and no one else will have it in their cache
376of known (and trusted) root certificates.
Bill Janssen426ea0a2007-08-29 22:35:05 +0000377
378
Guido van Rossum8ee23bb2007-08-27 19:11:11 +0000379Examples
380--------
381
Bill Janssen426ea0a2007-08-29 22:35:05 +0000382Testing for SSL support
383^^^^^^^^^^^^^^^^^^^^^^^
384
385To test for the presence of SSL support in a Python installation, user code should use the following idiom::
386
387 try:
388 import ssl
389 except ImportError:
390 pass
391 else:
392 [ do something that requires SSL support ]
393
394Client-side operation
395^^^^^^^^^^^^^^^^^^^^^
396
Guido van Rossum8ee23bb2007-08-27 19:11:11 +0000397This example connects to an SSL server, prints the server's address and certificate,
398sends some bytes, and reads part of the response::
399
400 import socket, ssl, pprint
401
402 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Bill Janssen98d19da2007-09-10 21:51:02 +0000403
404 # require a certificate from the server
405 ssl_sock = ssl.wrap_socket(s,
406 ca_certs="/etc/ca_certs_file",
407 cert_reqs=ssl.CERT_REQUIRED)
Guido van Rossum8ee23bb2007-08-27 19:11:11 +0000408
409 ssl_sock.connect(('www.verisign.com', 443))
410
411 print repr(ssl_sock.getpeername())
Bill Janssen98d19da2007-09-10 21:51:02 +0000412 print ssl_sock.cipher()
Guido van Rossum8ee23bb2007-08-27 19:11:11 +0000413 print pprint.pformat(ssl_sock.getpeercert())
414
415 # Set a simple HTTP request -- use httplib in actual code.
416 ssl_sock.write("""GET / HTTP/1.0\r
417 Host: www.verisign.com\r\n\r\n""")
418
419 # Read a chunk of data. Will not necessarily
420 # read all the data returned by the server.
421 data = ssl_sock.read()
422
Bill Janssen98d19da2007-09-10 21:51:02 +0000423 # note that closing the SSLSocket will also close the underlying socket
Guido van Rossum8ee23bb2007-08-27 19:11:11 +0000424 ssl_sock.close()
425
Bill Janssen98d19da2007-09-10 21:51:02 +0000426As of September 6, 2007, the certificate printed by this program
Guido van Rossum8ee23bb2007-08-27 19:11:11 +0000427looked like this::
428
Bill Janssen98d19da2007-09-10 21:51:02 +0000429 {'notAfter': 'May 8 23:59:59 2009 GMT',
430 'subject': ((('serialNumber', u'2497886'),),
431 (('1.3.6.1.4.1.311.60.2.1.3', u'US'),),
432 (('1.3.6.1.4.1.311.60.2.1.2', u'Delaware'),),
433 (('countryName', u'US'),),
434 (('postalCode', u'94043'),),
435 (('stateOrProvinceName', u'California'),),
436 (('localityName', u'Mountain View'),),
437 (('streetAddress', u'487 East Middlefield Road'),),
438 (('organizationName', u'VeriSign, Inc.'),),
439 (('organizationalUnitName',
440 u'Production Security Services'),),
441 (('organizationalUnitName',
442 u'Terms of use at www.verisign.com/rpa (c)06'),),
443 (('commonName', u'www.verisign.com'),))}
444
445which is a fairly poorly-formed ``subject`` field.
Guido van Rossum8ee23bb2007-08-27 19:11:11 +0000446
Bill Janssen426ea0a2007-08-29 22:35:05 +0000447Server-side operation
448^^^^^^^^^^^^^^^^^^^^^
449
Guido van Rossum8ee23bb2007-08-27 19:11:11 +0000450For server operation, typically you'd need to have a server certificate, and private key, each in a file.
451You'd open a socket, bind it to a port, call :meth:`listen` on it, then start waiting for clients
452to connect::
453
454 import socket, ssl
455
456 bindsocket = socket.socket()
457 bindsocket.bind(('myaddr.mydomain.com', 10023))
458 bindsocket.listen(5)
459
460When one did, you'd call :meth:`accept` on the socket to get the new socket from the other
Bill Janssen98d19da2007-09-10 21:51:02 +0000461end, and use :func:`wrap_socket` to create a server-side SSL context for it::
Guido van Rossum8ee23bb2007-08-27 19:11:11 +0000462
463 while True:
464 newsocket, fromaddr = bindsocket.accept()
Bill Janssen98d19da2007-09-10 21:51:02 +0000465 connstream = ssl.wrap_socket(newsocket,
466 server_side=True,
467 certfile="mycertfile",
468 keyfile="mykeyfile",
469 ssl_protocol=ssl.PROTOCOL_TLSv1)
Guido van Rossum8ee23bb2007-08-27 19:11:11 +0000470 deal_with_client(connstream)
471
Bill Janssen426ea0a2007-08-29 22:35:05 +0000472Then 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)::
Guido van Rossum8ee23bb2007-08-27 19:11:11 +0000473
474 def deal_with_client(connstream):
475
476 data = connstream.read()
477 # null data means the client is finished with us
478 while data:
479 if not do_something(connstream, data):
Bill Janssen98d19da2007-09-10 21:51:02 +0000480 # we'll assume do_something returns False
481 # when we're finished with client
Guido van Rossum8ee23bb2007-08-27 19:11:11 +0000482 break
483 data = connstream.read()
484 # finished with client
485 connstream.close()
486
487And go back to listening for new client connections.
488
489
Bill Janssen98d19da2007-09-10 21:51:02 +0000490.. seealso::
Bill Janssen426ea0a2007-08-29 22:35:05 +0000491
Bill Janssen98d19da2007-09-10 21:51:02 +0000492 Class :class:`socket.socket`
493 Documentation of underlying :mod:`socket` class
Bill Janssen426ea0a2007-08-29 22:35:05 +0000494
Bill Janssen98d19da2007-09-10 21:51:02 +0000495 `Introducing SSL and Certificates using OpenSSL <http://old.pseudonym.org/ssl/wwwj-index.html>`_
496 Frederick J. Hirsch
Bill Janssen426ea0a2007-08-29 22:35:05 +0000497
Bill Janssen98d19da2007-09-10 21:51:02 +0000498 `RFC 1422: Privacy Enhancement for Internet Electronic Mail: Part II: Certificate-Based Key Management <http://www.ietf.org/rfc/rfc1422>`_
499 Steve Kent
Bill Janssen426ea0a2007-08-29 22:35:05 +0000500
Bill Janssen98d19da2007-09-10 21:51:02 +0000501 `RFC 1750: Randomness Recommendations for Security <http://www.ietf.org/rfc/rfc1750>`_
502 D. Eastlake et. al.
Bill Janssenffe576d2007-09-05 00:46:27 +0000503
Bill Janssen98d19da2007-09-10 21:51:02 +0000504 `RFC 3280: Internet X.509 Public Key Infrastructure Certificate and CRL Profile <http://www.ietf.org/rfc/rfc3280>`_
505 Housley et. al.