Skip to content

Commit 894bef4

Browse files
authored
enable ssl_version as a JKG config option (#340)
* enable ssl_version as a JKG config option
1 parent d7fd58f commit 894bef4

File tree

2 files changed

+26
-6
lines changed

2 files changed

+26
-6
lines changed

kernel_gateway/gatewayapp.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import sys
1010
import signal
1111
import socket
12+
import ssl
1213
from distutils.util import strtobool
1314

1415
import nbformat
@@ -52,7 +53,8 @@
5253
'seed_uri': 'KernelGatewayApp.seed_uri',
5354
'keyfile': 'KernelGatewayApp.keyfile',
5455
'certfile': 'KernelGatewayApp.certfile',
55-
'client-ca': 'KernelGatewayApp.client_ca'
56+
'client-ca': 'KernelGatewayApp.client_ca',
57+
'ssl_version': 'KernelGatewayApp.ssl_version'
5658
})
5759

5860

@@ -298,6 +300,16 @@ def keyfile_default(self):
298300
def client_ca_default(self):
299301
return os.getenv(self.client_ca_env)
300302

303+
ssl_version_env = 'KG_SSL_VERSION'
304+
ssl_version_default_value = ssl.PROTOCOL_TLSv1_2
305+
ssl_version = Integer(None, config=True, allow_none=True,
306+
help="""Sets the SSL version to use for the web socket connection. (KG_SSL_VERSION env var)""")
307+
308+
@default('ssl_version')
309+
def ssl_version_default(self):
310+
ssl_from_env = os.getenv(self.ssl_version_env)
311+
return ssl_from_env if ssl_from_env is None else int(ssl_from_env)
312+
301313
kernel_spec_manager = Instance(KernelSpecManager, allow_none=True)
302314

303315
kernel_spec_manager_class = Type(
@@ -494,14 +506,13 @@ def _build_ssl_options(self):
494506
ssl_options['keyfile'] = self.keyfile
495507
if self.client_ca:
496508
ssl_options['ca_certs'] = self.client_ca
509+
if self.ssl_version:
510+
ssl_options['ssl_version'] = self.ssl_version
497511
if not ssl_options:
498512
# None indicates no SSL config
499513
ssl_options = None
500514
else:
501-
# SSL may be missing, so only import it if it's to be used
502-
import ssl
503-
# Disable SSLv3 by default, since its use is discouraged.
504-
ssl_options.setdefault('ssl_version', ssl.PROTOCOL_TLSv1)
515+
ssl_options.setdefault('ssl_version', self.ssl_version_default_value)
505516
if ssl_options.get('ca_certs', False):
506517
ssl_options.setdefault('cert_reqs', ssl.CERT_REQUIRED)
507518

kernel_gateway/tests/test_gatewayapp.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ def test_config_env_vars(self):
4343
os.environ['KG_KEYFILE'] = '/test/fake.key'
4444
os.environ['KG_CERTFILE'] = '/test/fake.crt'
4545
os.environ['KG_CLIENT_CA'] = '/test/fake_ca.crt'
46+
os.environ['KG_SSL_VERSION'] = '3'
4647
os.environ['KG_TRUST_XHEADERS'] = 'false'
4748

4849

@@ -67,6 +68,7 @@ def test_config_env_vars(self):
6768
self.assertEqual(app.keyfile, '/test/fake.key')
6869
self.assertEqual(app.certfile, '/test/fake.crt')
6970
self.assertEqual(app.client_ca, '/test/fake_ca.crt')
71+
self.assertEqual(app.ssl_version, 3)
7072
self.assertEqual(app.trust_xheaders, False)
7173

7274
def test_trust_xheaders(self):
@@ -77,7 +79,14 @@ def test_trust_xheaders(self):
7779
app = KernelGatewayApp()
7880
self.assertEqual(app.trust_xheaders, True)
7981

80-
82+
def test_ssl_options(self):
83+
app = KernelGatewayApp()
84+
ssl_options = app._build_ssl_options()
85+
self.assertIsNone(ssl_options)
86+
app = KernelGatewayApp()
87+
os.environ['KG_CERTFILE'] = '/test/fake.crt'
88+
ssl_options = app._build_ssl_options()
89+
self.assertEqual(ssl_options['ssl_version'], 5)
8190

8291
class TestGatewayAppBase(AsyncHTTPTestCase, ExpectLog):
8392
"""Base class for integration style tests using HTTP/Websockets against an

0 commit comments

Comments
 (0)