mirror of
https://github.com/python/cpython.git
synced 2025-08-30 21:48:47 +00:00
bpo-31429: Define TLS cipher suite on build time (#3532)
Until now Python used a hard coded white list of default TLS cipher suites. The old approach has multiple downsides. OpenSSL's default selection was completely overruled. Python did neither benefit from new cipher suites (ChaCha20, TLS 1.3 suites) nor blacklisted cipher suites. For example we used to re-enable 3DES. Python now defaults to OpenSSL DEFAULT cipher suite selection and black lists all unwanted ciphers. Downstream vendors can override the default cipher list with --with-ssl-default-suites. Signed-off-by: Christian Heimes <christian@python.org>
This commit is contained in:
parent
d951157268
commit
892d66e422
8 changed files with 153 additions and 48 deletions
|
@ -18,6 +18,7 @@ import asyncore
|
|||
import weakref
|
||||
import platform
|
||||
import functools
|
||||
import sysconfig
|
||||
try:
|
||||
import ctypes
|
||||
except ImportError:
|
||||
|
@ -30,7 +31,7 @@ PROTOCOLS = sorted(ssl._PROTOCOL_NAMES)
|
|||
HOST = support.HOST
|
||||
IS_LIBRESSL = ssl.OPENSSL_VERSION.startswith('LibreSSL')
|
||||
IS_OPENSSL_1_1 = not IS_LIBRESSL and ssl.OPENSSL_VERSION_INFO >= (1, 1, 0)
|
||||
|
||||
PY_SSL_DEFAULT_CIPHERS = sysconfig.get_config_var('PY_SSL_DEFAULT_CIPHERS')
|
||||
|
||||
def data_file(*name):
|
||||
return os.path.join(os.path.dirname(__file__), *name)
|
||||
|
@ -936,6 +937,19 @@ class ContextTests(unittest.TestCase):
|
|||
with self.assertRaisesRegex(ssl.SSLError, "No cipher can be selected"):
|
||||
ctx.set_ciphers("^$:,;?*'dorothyx")
|
||||
|
||||
@unittest.skipUnless(PY_SSL_DEFAULT_CIPHERS == 1,
|
||||
"Test applies only to Python default ciphers")
|
||||
def test_python_ciphers(self):
|
||||
ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
|
||||
ciphers = ctx.get_ciphers()
|
||||
for suite in ciphers:
|
||||
name = suite['name']
|
||||
self.assertNotIn("PSK", name)
|
||||
self.assertNotIn("SRP", name)
|
||||
self.assertNotIn("MD5", name)
|
||||
self.assertNotIn("RC4", name)
|
||||
self.assertNotIn("3DES", name)
|
||||
|
||||
@unittest.skipIf(ssl.OPENSSL_VERSION_INFO < (1, 0, 2, 0, 0), 'OpenSSL too old')
|
||||
def test_get_ciphers(self):
|
||||
ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue