Skip to content

Commit 2935c07

Browse files
committed
Support setting "ssl_verify_flags" to override Python's default
1 parent 212c157 commit 2935c07

File tree

5 files changed

+46
-9
lines changed

5 files changed

+46
-9
lines changed

docs/config.rst

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,21 @@ Options for configuring the log handler
9090
*Default*: ``True``
9191

9292

93+
``ssl_verify_flags``
94+
95+
Specify verify flags for Python's `ssl.SSLContext`.
96+
See the Python documentation for valid values.
97+
This can be useful to override Python 3.13's strict verify flags by passing `0`.
98+
99+
Only used for `logstash_async.transport.TcpTransport`,
100+
``logstash_async.transport.BeatsTransport`` and
101+
``logstash_async.transport.HttpTransport``.
102+
103+
*Type*: ``integer``
104+
105+
*Default*: None
106+
107+
93108
``keyfile``
94109

95110
The path to client side SSL key file.

logstash_async/handler.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class SynchronousLogstashHandler(Handler):
2121
:param transport: Callable or path to a compatible transport class.
2222
:param ssl_enable: Should SSL be enabled for the connection? Default is False.
2323
:param ssl_verify: Should the server's SSL certificate be verified?
24+
:param ssl_verify_flags: Verification flags for ssl.SSLContext (Default: None)
2425
:param keyfile: The path to client side SSL key file (default is None).
2526
:param certfile: The path to client side SSL certificate file (default is None).
2627
:param ca_certs: The path to the file containing recognized CA certificates.
@@ -29,16 +30,17 @@ class SynchronousLogstashHandler(Handler):
2930
"""
3031

3132
# ----------------------------------------------------------------------
32-
# pylint: disable=too-many-arguments
33+
# pylint: disable=too-many-arguments,too-many-positional-arguments
3334
def __init__(self, host, port, transport='logstash_async.transport.TcpTransport',
34-
ssl_enable=False, ssl_verify=True, keyfile=None, certfile=None, ca_certs=None,
35-
enable=True, encoding='utf-8', **kwargs):
35+
ssl_enable=False, ssl_verify=True, ssl_verify_flags=None, keyfile=None,
36+
certfile=None, ca_certs=None, enable=True, encoding='utf-8', **kwargs):
3637
super().__init__()
3738
self._host = host
3839
self._port = port
3940
self._transport_path = transport
4041
self._ssl_enable = ssl_enable
4142
self._ssl_verify = ssl_verify
43+
self._ssl_verify_flags = ssl_verify_flags
4244
self._keyfile = keyfile
4345
self._certfile = certfile
4446
self._ca_certs = ca_certs
@@ -72,6 +74,7 @@ def _setup_transport(self, **kwargs):
7274
timeout=constants.SOCKET_TIMEOUT,
7375
ssl_enable=self._ssl_enable,
7476
ssl_verify=self._ssl_verify,
77+
ssl_verify_flags=self._ssl_verify_flags,
7578
keyfile=self._keyfile,
7679
certfile=self._certfile,
7780
ca_certs=self._ca_certs,
@@ -135,16 +138,17 @@ class AsynchronousLogstashHandler(SynchronousLogstashHandler):
135138
_worker_thread = None
136139

137140
# ----------------------------------------------------------------------
138-
# pylint: disable=too-many-arguments
141+
# pylint: disable=too-many-arguments,too-many-positional-arguments
139142
def __init__(self, host, port, database_path, transport='logstash_async.transport.TcpTransport',
140-
ssl_enable=False, ssl_verify=True, keyfile=None, certfile=None, ca_certs=None,
141-
enable=True, event_ttl=None, encoding='utf-8', **kwargs):
143+
ssl_enable=False, ssl_verify=True, ssl_verify_flags=None, keyfile=None,
144+
certfile=None, ca_certs=None, enable=True, event_ttl=None, encoding='utf-8',
145+
**kwargs):
142146

143147
self._database_path = database_path
144148
self._event_ttl = event_ttl
145149

146150
super().__init__(host, port, transport,
147-
ssl_enable, ssl_verify, keyfile, certfile, ca_certs,
151+
ssl_enable, ssl_verify, ssl_verify_flags, keyfile, certfile, ca_certs,
148152
enable, encoding, **kwargs)
149153

150154
# ----------------------------------------------------------------------
@@ -178,6 +182,7 @@ def _start_worker_thread(self):
178182
transport=self._transport,
179183
ssl_enable=self._ssl_enable,
180184
ssl_verify=self._ssl_verify,
185+
ssl_verify_flags=self._ssl_verify_flags,
181186
keyfile=self._keyfile,
182187
certfile=self._certfile,
183188
ca_certs=self._ca_certs,

logstash_async/transport.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ class Transport(ABC):
4848
:type ssl_enable: bool
4949
:param ssl_verify: Activates the TLS certificate verification.
5050
:type ssl_verify: bool or str
51+
:param ssl_verify_flags: Verification flags for ssl.SSLContext or None
52+
:type ssl_verify_flags: int
5153
:param use_logging: Use logging for debugging.
5254
:type use_logging: bool
5355
"""
@@ -59,13 +61,15 @@ def __init__(
5961
timeout: Union[None, float],
6062
ssl_enable: bool,
6163
ssl_verify: Union[bool, str],
64+
ssl_verify_flags: Union[None, int],
6265
use_logging: bool,
6366
):
6467
self._host = host
6568
self._port = port
6669
self._timeout = None if timeout is TimeoutNotSet else timeout
6770
self._ssl_enable = ssl_enable
6871
self._ssl_verify = ssl_verify
72+
self._ssl_verify_flags = ssl_verify_flags
6973
self._use_logging = use_logging
7074
super().__init__()
7175

@@ -191,6 +195,7 @@ def __init__( # pylint: disable=too-many-arguments
191195
port,
192196
ssl_enable,
193197
ssl_verify,
198+
ssl_verify_flags,
194199
keyfile,
195200
certfile,
196201
ca_certs,
@@ -199,6 +204,7 @@ def __init__( # pylint: disable=too-many-arguments
199204
super().__init__(host, port)
200205
self._ssl_enable = ssl_enable
201206
self._ssl_verify = ssl_verify
207+
self._ssl_verify_flags = ssl_verify_flags
202208
self._keyfile = keyfile
203209
self._certfile = certfile
204210
self._ca_certs = ca_certs
@@ -227,6 +233,10 @@ def _create_socket(self):
227233

228234
ssl_context.check_hostname = False
229235
ssl_context.verify_mode = cert_reqs
236+
237+
if self._ssl_verify_flags is not None:
238+
ssl_context.verify_flags = self._ssl_verify_flags
239+
230240
if self._certfile and self._keyfile:
231241
ssl_context.load_cert_chain(self._certfile, self._keyfile)
232242
self._sock = ssl_context.wrap_socket(self._sock, server_side=False)
@@ -257,6 +267,7 @@ def __init__( # pylint: disable=too-many-arguments
257267
port,
258268
ssl_enable,
259269
ssl_verify,
270+
ssl_verify_flags,
260271
keyfile,
261272
certfile,
262273
ca_certs,
@@ -269,6 +280,7 @@ def __init__( # pylint: disable=too-many-arguments
269280
timeout=timeout_,
270281
ssl_enable=ssl_enable,
271282
ssl_verify=ssl_verify,
283+
ssl_verify_flags=ssl_verify_flags,
272284
keyfile=keyfile,
273285
certfile=certfile,
274286
ca_certs=ca_certs,
@@ -308,6 +320,8 @@ class HttpTransport(Transport):
308320
pass a string with a file location to CA certificate the class tries to
309321
validate it against it. (Default: True)
310322
:type ssl_verify: bool or str
323+
:param ssl_verify_flags: Verification flags for ssl.SSLContext (Default: None)
324+
:type ssl_verify_flags: int
311325
:param use_logging: Use logging for debugging.
312326
:type use_logging: bool
313327
:param username: Username for basic authorization. (Default: "")
@@ -319,18 +333,20 @@ class HttpTransport(Transport):
319333
:type max_content_length: int
320334
"""
321335

336+
# pylint: disable=too-many-arguments,too-many-positional-arguments
322337
def __init__(
323338
self,
324339
host: str,
325340
port: int,
326341
timeout: Union[None, float] = TimeoutNotSet,
327342
ssl_enable: bool = True,
328343
ssl_verify: Union[bool, str] = True,
344+
ssl_verify_flags: Union[None, int] = None,
329345
use_logging: bool = False,
330346
path: str = '',
331347
**kwargs
332348
):
333-
super().__init__(host, port, timeout, ssl_enable, ssl_verify, use_logging)
349+
super().__init__(host, port, timeout, ssl_enable, ssl_verify, ssl_verify_flags, use_logging)
334350
self._username = kwargs.get('username')
335351
self._password = kwargs.get('password')
336352
self._max_content_length = kwargs.get('max_content_length', 100 * 1024 * 1024)

logstash_async/worker.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ def __init__(self, *args, **kwargs):
4949
self._transport = kwargs.pop('transport')
5050
self._ssl_enable = kwargs.pop('ssl_enable')
5151
self._ssl_verify = kwargs.pop('ssl_verify')
52+
self._ssl_verify_flags = kwargs.pop('ssl_verify_flags')
5253
self._keyfile = kwargs.pop('keyfile')
5354
self._certfile = kwargs.pop('certfile')
5455
self._ca_certs = kwargs.pop('ca_certs')

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
'Documentation': 'https://python-logstash-async.readthedocs.io/en/stable/',
4141
},
4242
keywords='logging logstash asynchronous',
43-
install_requires=['limits', 'pylogbeat', 'requests'],
43+
install_requires=['limits', 'pylogbeat>=2.1.0', 'requests'],
4444
extras_require={
4545
'dev': ['django', 'flask'],
4646
'docs': ['sphinx-rtd-theme'],

0 commit comments

Comments
 (0)