1717log = logging .getLogger (__name__ )
1818
1919
20+ DEFAULT_SSL_CIPHERS = (
21+ "ECDHE-RSA-AES256-GCM-SHA384" ,
22+ "ECDHE-ECDSA-AES256-GCM-SHA384" ,
23+ "ECDHE-RSA-CHACHA20-POLY1305" ,
24+ "ECDHE-ECDSA-CHACHA20-POLY1305" ,
25+ "ECDHE-RSA-AES128-GCM-SHA256" ,
26+ "ECDHE-ECDSA-AES128-GCM-SHA256" ,
27+ )
28+
29+ DEFAULT_SSL_MIN_VERSION = ssl .TLSVersion .TLSv1_3
30+ DEFAULT_SSL_MAX_VERSION = ssl .TLSVersion .TLSv1_3
31+
32+
2033@dataclass (frozen = True )
2134class SSLOptionsBase :
2235 cert : Optional [Path ]
@@ -25,23 +38,19 @@ class SSLOptionsBase:
2538 verify : bool
2639 require_client_cert : bool
2740 purpose : ssl .Purpose
28- minimum_version : ssl .TLSVersion = ssl .TLSVersion .TLSv1_3
29- maximum_version : ssl .TLSVersion = ssl .TLSVersion .TLSv1_3
30- ciphers : Tuple [str , ...] = (
31- "ECDHE-RSA-AES256-GCM-SHA384" ,
32- "ECDHE-ECDSA-AES256-GCM-SHA384" ,
33- "ECDHE-RSA-CHACHA20-POLY1305" ,
34- "ECDHE-ECDSA-CHACHA20-POLY1305" ,
35- "ECDHE-RSA-AES128-GCM-SHA256" ,
36- "ECDHE-ECDSA-AES128-GCM-SHA256" ,
37- )
41+ minimum_version : ssl .TLSVersion = DEFAULT_SSL_MIN_VERSION
42+ maximum_version : ssl .TLSVersion = DEFAULT_SSL_MAX_VERSION
43+ ciphers : Tuple [str , ...] = DEFAULT_SSL_CIPHERS
3844
3945
4046class SSLOptions (SSLOptionsBase ):
4147 def __init__ (
4248 self , cert : Optional [PathOrStr ], key : Optional [PathOrStr ],
4349 ca : Optional [PathOrStr ], verify : bool , require_client_cert : bool ,
4450 purpose : ssl .Purpose ,
51+ minimum_version : ssl .TLSVersion = DEFAULT_SSL_MIN_VERSION ,
52+ maximum_version : ssl .TLSVersion = DEFAULT_SSL_MAX_VERSION ,
53+ ciphers : Tuple [str , ...] = DEFAULT_SSL_CIPHERS ,
4554 ) -> None :
4655 super ().__init__ (
4756 cert = Path (cert ) if cert else None ,
@@ -50,6 +59,9 @@ def __init__(
5059 verify = verify ,
5160 require_client_cert = require_client_cert ,
5261 purpose = purpose ,
62+ minimum_version = minimum_version ,
63+ maximum_version = maximum_version ,
64+ ciphers = ciphers ,
5365 )
5466
5567 def create_context (self ) -> ssl .SSLContext :
@@ -99,13 +111,20 @@ def __init__(
99111 self , * , address : Optional [str ] = None , port : Optional [int ] = None ,
100112 cert : PathOrStr , key : PathOrStr , ca : Optional [PathOrStr ] = None ,
101113 require_client_cert : bool = False , verify : bool = True ,
114+ minimum_version : ssl .TLSVersion = DEFAULT_SSL_MIN_VERSION ,
115+ maximum_version : ssl .TLSVersion = DEFAULT_SSL_MAX_VERSION ,
116+ ciphers : Tuple [str , ...] = DEFAULT_SSL_CIPHERS ,
102117 options : OptionsType = (), sock : Optional [socket .socket ] = None ,
103118 ** kwargs : Any ,
104119 ):
105120
106121 self .__ssl_options = SSLOptions (
107- cert , key , ca , verify , require_client_cert ,
108- ssl .Purpose .CLIENT_AUTH ,
122+ cert = cert , key = key , ca = ca , verify = verify ,
123+ require_client_cert = require_client_cert ,
124+ purpose = ssl .Purpose .CLIENT_AUTH ,
125+ minimum_version = minimum_version ,
126+ maximum_version = maximum_version ,
127+ ciphers = ciphers ,
109128 )
110129
111130 if not sock :
0 commit comments