Issue #20995: Enhance default ciphers used by the ssl module

Closes #20995 by Enabling better security by prioritizing ciphers
such that:

* Prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE)
* Prefer ECDHE over DHE for better performance
* Prefer any AES-GCM over any AES-CBC for better performance and security
* Then Use HIGH cipher suites as a fallback
* Then Use 3DES as fallback which is secure but slow
* Finally use RC4 as a fallback which is problematic but needed for
  compatibility some times.
* Disable NULL authentication, NULL encryption, and MD5 MACs for security
  reasons
This commit is contained in:
Donald Stufft 2014-03-21 21:33:34 -04:00
parent 51f3129ba2
commit 79ccaa2cad
3 changed files with 37 additions and 18 deletions

View file

@ -1665,17 +1665,10 @@ If you have advanced security requirements, fine-tuning of the ciphers
enabled when negotiating a SSL session is possible through the enabled when negotiating a SSL session is possible through the
:meth:`SSLContext.set_ciphers` method. Starting from Python 3.2.3, the :meth:`SSLContext.set_ciphers` method. Starting from Python 3.2.3, the
ssl module disables certain weak ciphers by default, but you may want ssl module disables certain weak ciphers by default, but you may want
to further restrict the cipher choice. For example:: to further restrict the cipher choice. Be sure to read OpenSSL's documentation
about the `cipher list format <http://www.openssl.org/docs/apps/ciphers.html#CIPHER_LIST_FORMAT>`_.
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1) If you want to check which ciphers are enabled by a given cipher list, use the
context.set_ciphers('HIGH:!aNULL:!eNULL') ``openssl ciphers`` command on your system.
The ``!aNULL:!eNULL`` part of the cipher spec is necessary to disable ciphers
which don't provide both encryption and authentication. Be sure to read
OpenSSL's documentation about the `cipher list
format <http://www.openssl.org/docs/apps/ciphers.html#CIPHER_LIST_FORMAT>`_.
If you want to check which ciphers are enabled by a given cipher list,
use the ``openssl ciphers`` command on your system.
Multi-processing Multi-processing
^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^

View file

@ -162,14 +162,37 @@ else:
# Disable weak or insecure ciphers by default # Disable weak or insecure ciphers by default
# (OpenSSL's default setting is 'DEFAULT:!aNULL:!eNULL') # (OpenSSL's default setting is 'DEFAULT:!aNULL:!eNULL')
_DEFAULT_CIPHERS = 'DEFAULT:!aNULL:!eNULL:!LOW:!EXPORT:!SSLv2' # Enable a better set of ciphers by default
# This list has been explicitly chosen to:
# * Prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE)
# * Prefer ECDHE over DHE for better performance
# * Prefer any AES-GCM over any AES-CBC for better performance and security
# * Then Use HIGH cipher suites as a fallback
# * Then Use 3DES as fallback which is secure but slow
# * Finally use RC4 as a fallback which is problematic but needed for
# compatibility some times.
# * Disable NULL authentication, NULL encryption, and MD5 MACs for security
# reasons
_DEFAULT_CIPHERS = (
'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+HIGH:'
'DH+HIGH:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+HIGH:RSA+3DES:ECDH+RC4:'
'DH+RC4:RSA+RC4:!aNULL:!eNULL:!MD5'
)
# restricted and more secure ciphers # Restricted and more secure ciphers
# HIGH: high encryption cipher suites with key length >= 128 bits (no MD5) # This list has been explicitly chosen to:
# !aNULL: only authenticated cipher suites (no anonymous DH) # * Prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE)
# !RC4: no RC4 streaming cipher, RC4 is broken # * Prefer ECDHE over DHE for better performance
# !DSS: RSA is preferred over DSA # * Prefer any AES-GCM over any AES-CBC for better performance and security
_RESTRICTED_CIPHERS = 'HIGH:!aNULL:!RC4:!DSS' # * Then Use HIGH cipher suites as a fallback
# * Then Use 3DES as fallback which is secure but slow
# * Disable NULL authentication, NULL encryption, MD5 MACs, DSS, and RC4 for
# security reasons
_RESTRICTED_CIPHERS = (
'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+HIGH:'
'DH+HIGH:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+HIGH:RSA+3DES:!aNULL:'
'!eNULL:!MD5:!DSS:!RC4'
)
class CertificateError(ValueError): class CertificateError(ValueError):

View file

@ -21,6 +21,9 @@ Core and Builtins
Library Library
------- -------
- Issue #20995: Enhance default ciphers used by the ssl module to enable
better security an prioritize perfect forward secrecy.
- Issue #20884: Don't assume that __file__ is defined on importlib.__init__. - Issue #20884: Don't assume that __file__ is defined on importlib.__init__.
- Issue #20879: Delay the initialization of encoding and decoding tables for - Issue #20879: Delay the initialization of encoding and decoding tables for