@@ -57,6 +57,32 @@ def get_config_variable(
5757 return result
5858
5959
60+ def create_ssl_context () -> ssl .SSLContext :
61+ """Set strong SSL defaults: require TLSv1.2+
62+
63+ `ssl` uses bitwise operations to specify context `<enum 'Options'>`
64+ """
65+
66+ ssl_context_options : list [int ] = [
67+ ssl .OP_NO_COMPRESSION ,
68+ ssl .OP_NO_TICKET , # pylint: disable=no-member
69+ ssl .OP_NO_RENEGOTIATION , # pylint: disable=no-member
70+ ssl .OP_SINGLE_DH_USE ,
71+ ssl .OP_SINGLE_ECDH_USE ,
72+ ssl .OP_NO_SSLv3 ,
73+ ssl .OP_NO_TLSv1 ,
74+ ssl .OP_NO_TLSv1_1 ,
75+ ]
76+ ssl_context = ssl .create_default_context (purpose = ssl .Purpose .SERVER_AUTH )
77+ ssl_context .options &= ~ ssl .OP_ENABLE_MIDDLEBOX_COMPAT # pylint: disable=no-member
78+ ssl_context .verify_mode = ssl .CERT_REQUIRED
79+
80+ for option in ssl_context_options :
81+ ssl_context .options |= option
82+
83+ return ssl_context
84+
85+
6086class ListenQueue (threading .Thread ):
6187 """Main class for the ListenQueue used in OpenCTIConnectorHelper
6288
@@ -137,23 +163,15 @@ def run(self):
137163 try :
138164 # Connect the broker
139165 self .pika_credentials = pika .PlainCredentials (self .user , self .password )
140- if self .use_ssl :
141- context = ssl .create_default_context ()
142- ssl_options = pika .SSLOptions (context , self .host )
143- self .pika_parameters = pika .ConnectionParameters (
144- host = self .host ,
145- port = self .port ,
146- virtual_host = "/" ,
147- credentials = self .pika_credentials ,
148- ssl_options = ssl_options ,
149- )
150- else :
151- self .pika_parameters = pika .ConnectionParameters (
152- host = self .host ,
153- port = self .port ,
154- virtual_host = "/" ,
155- credentials = self .pika_credentials ,
156- )
166+ self .pika_parameters = pika .ConnectionParameters (
167+ host = self .host ,
168+ port = self .port ,
169+ virtual_host = "/" ,
170+ credentials = self .pika_credentials ,
171+ ssl_options = pika .SSLOptions (create_ssl_context (), self .host )
172+ if self .use_ssl
173+ else None
174+ )
157175 self .pika_connection = pika .BlockingConnection (self .pika_parameters )
158176 self .channel = self .pika_connection .channel ()
159177 self .channel .basic_consume (
@@ -548,7 +566,7 @@ def send_stix2_bundle(self, bundle, **kwargs) -> list:
548566 self .config ["connection" ]["user" ], self .config ["connection" ]["pass" ]
549567 )
550568 if self .config ["connection" ]["use_ssl" ]:
551- context = ssl . create_default_context ()
569+ context = create_ssl_context ()
552570 ssl_options = pika .SSLOptions (context , self .config ["connection" ]["host" ])
553571 pika_parameters = pika .ConnectionParameters (
554572 host = self .config ["connection" ]["host" ],
0 commit comments