1 """Helper to create SSL contexts."""
4 from enum
import StrEnum
5 from functools
import cache
13 """SSL cipher lists."""
15 PYTHON_DEFAULT =
"python_default"
16 INTERMEDIATE =
"intermediate"
22 SSLCipherList.INTERMEDIATE: (
23 "ECDHE-ECDSA-CHACHA20-POLY1305:"
24 "ECDHE-RSA-CHACHA20-POLY1305:"
25 "ECDHE-ECDSA-AES128-GCM-SHA256:"
26 "ECDHE-RSA-AES128-GCM-SHA256:"
27 "ECDHE-ECDSA-AES256-GCM-SHA384:"
28 "ECDHE-RSA-AES256-GCM-SHA384:"
29 "DHE-RSA-AES128-GCM-SHA256:"
30 "DHE-RSA-AES256-GCM-SHA384:"
31 "ECDHE-ECDSA-AES128-SHA256:"
32 "ECDHE-RSA-AES128-SHA256:"
33 "ECDHE-ECDSA-AES128-SHA:"
34 "ECDHE-RSA-AES256-SHA384:"
35 "ECDHE-RSA-AES128-SHA:"
36 "ECDHE-ECDSA-AES256-SHA384:"
37 "ECDHE-ECDSA-AES256-SHA:"
38 "ECDHE-RSA-AES256-SHA:"
39 "DHE-RSA-AES128-SHA256:"
41 "DHE-RSA-AES256-SHA256:"
43 "ECDHE-ECDSA-DES-CBC3-SHA:"
44 "ECDHE-RSA-DES-CBC3-SHA:"
45 "EDH-RSA-DES-CBC3-SHA:"
55 SSLCipherList.MODERN: (
56 "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:"
57 "ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:"
58 "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:"
59 "ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:"
60 "ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256"
62 SSLCipherList.INSECURE:
"DEFAULT:@SECLEVEL=0",
72 sslcontext = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
73 sslcontext.check_hostname =
False
74 sslcontext.verify_mode = ssl.CERT_NONE
75 with contextlib.suppress(AttributeError):
77 sslcontext.options |= ssl.OP_NO_COMPRESSION
78 sslcontext.set_default_verify_paths()
79 if ssl_cipher_list != SSLCipherList.PYTHON_DEFAULT:
80 sslcontext.set_ciphers(SSL_CIPHER_LISTS[ssl_cipher_list])
87 ssl_cipher_list: SSLCipherList = SSLCipherList.PYTHON_DEFAULT,
92 cafile = environ.get(
"REQUESTS_CA_BUNDLE", certifi.where())
94 sslcontext = ssl.create_default_context(
95 purpose=ssl.Purpose.SERVER_AUTH, cafile=cafile
97 if ssl_cipher_list != SSLCipherList.PYTHON_DEFAULT:
98 sslcontext.set_ciphers(SSL_CIPHER_LISTS[ssl_cipher_list])
106 _NO_VERIFY_SSL_CONTEXTS = {
112 SSLCipherList.INTERMEDIATE:
_client_context(SSLCipherList.INTERMEDIATE),
119 """Return the default SSL context."""
120 return _DEFAULT_SSL_CONTEXT
124 """Return the default SSL context that does not verify the server certificate."""
125 return _DEFAULT_NO_VERIFY_SSL_CONTEXT
129 ssl_cipher_list: SSLCipherList = SSLCipherList.PYTHON_DEFAULT,
131 """Return a SSL context with no verification with a specific ssl cipher."""
132 return _NO_VERIFY_SSL_CONTEXTS.get(ssl_cipher_list, _DEFAULT_NO_VERIFY_SSL_CONTEXT)
136 ssl_cipher_list: SSLCipherList = SSLCipherList.PYTHON_DEFAULT,
138 """Return an SSL context for making requests."""
139 return _SSL_CONTEXTS.get(ssl_cipher_list, _DEFAULT_SSL_CONTEXT)
143 ssl_cipher_list: SSLCipherList = SSLCipherList.PYTHON_DEFAULT,
145 """Return an SSL context that does not verify the server certificate."""
150 """Return an SSL context following the Mozilla recommendations.
152 TLS configuration follows the best-practice guidelines specified here:
153 https://wiki.mozilla.org/Security/Server_Side_TLS
154 Modern guidelines are followed.
156 context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
157 context.minimum_version = ssl.TLSVersion.TLSv1_2
159 context.options |= ssl.OP_CIPHER_SERVER_PREFERENCE
160 if hasattr(ssl,
"OP_NO_COMPRESSION"):
161 context.options |= ssl.OP_NO_COMPRESSION
163 context.set_ciphers(SSL_CIPHER_LISTS[SSLCipherList.MODERN])
169 """Return an SSL context following the Mozilla recommendations.
171 TLS configuration follows the best-practice guidelines specified here:
172 https://wiki.mozilla.org/Security/Server_Side_TLS
173 Intermediate guidelines are followed.
175 context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
178 ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3 | ssl.OP_CIPHER_SERVER_PREFERENCE
180 if hasattr(ssl,
"OP_NO_COMPRESSION"):
181 context.options |= ssl.OP_NO_COMPRESSION
183 context.set_ciphers(SSL_CIPHER_LISTS[SSLCipherList.INTERMEDIATE])
ssl.SSLContext client_context(SSLCipherList ssl_cipher_list=SSLCipherList.PYTHON_DEFAULT)
ssl.SSLContext server_context_modern()
ssl.SSLContext create_no_verify_ssl_context(SSLCipherList ssl_cipher_list=SSLCipherList.PYTHON_DEFAULT)
ssl.SSLContext get_default_context()
ssl.SSLContext client_context_no_verify(SSLCipherList ssl_cipher_list=SSLCipherList.PYTHON_DEFAULT)
ssl.SSLContext _client_context(SSLCipherList ssl_cipher_list=SSLCipherList.PYTHON_DEFAULT)
ssl.SSLContext get_default_no_verify_context()
ssl.SSLContext _client_context_no_verify(SSLCipherList ssl_cipher_list)
ssl.SSLContext server_context_intermediate()