Skip to content
This repository was archived by the owner on Dec 5, 2025. It is now read-only.

Commit 645e06e

Browse files
authored
[connector] Create default SSL context for pika (#162)
Add `create_ssl_context()` function to require TLSv1.2, certificate validation, and disable insecure SSL flags by default.
1 parent a42825c commit 645e06e

File tree

1 file changed

+36
-18
lines changed

1 file changed

+36
-18
lines changed

pycti/connector/opencti_connector_helper.py

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
6086
class 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

Comments
 (0)