|
@@ -2,6 +2,7 @@ from __future__ import absolute_import
|
|
|
from __future__ import unicode_literals
|
|
|
|
|
|
import logging
|
|
|
+import ssl
|
|
|
|
|
|
from docker import APIClient
|
|
|
from docker.errors import TLSParameterError
|
|
@@ -16,7 +17,24 @@ from .utils import unquote_path
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
-def tls_config_from_options(options):
|
|
|
+def get_tls_version(environment):
|
|
|
+ compose_tls_version = environment.get('COMPOSE_TLS_VERSION', None)
|
|
|
+ if not compose_tls_version:
|
|
|
+ return None
|
|
|
+
|
|
|
+ tls_attr_name = "PROTOCOL_{}".format(compose_tls_version)
|
|
|
+ if not hasattr(ssl, tls_attr_name):
|
|
|
+ log.warn(
|
|
|
+ 'The "{}" protocol is unavailable. You may need to update your '
|
|
|
+ 'version of Python or OpenSSL. Falling back to TLSv1 (default).'
|
|
|
+ .format(compose_tls_version)
|
|
|
+ )
|
|
|
+ return None
|
|
|
+
|
|
|
+ return getattr(ssl, tls_attr_name)
|
|
|
+
|
|
|
+
|
|
|
+def tls_config_from_options(options, environment=None):
|
|
|
tls = options.get('--tls', False)
|
|
|
ca_cert = unquote_path(options.get('--tlscacert'))
|
|
|
cert = unquote_path(options.get('--tlscert'))
|
|
@@ -24,7 +42,9 @@ def tls_config_from_options(options):
|
|
|
verify = options.get('--tlsverify')
|
|
|
skip_hostname_check = options.get('--skip-hostname-check', False)
|
|
|
|
|
|
- advanced_opts = any([ca_cert, cert, key, verify])
|
|
|
+ tls_version = get_tls_version(environment or {})
|
|
|
+
|
|
|
+ advanced_opts = any([ca_cert, cert, key, verify, tls_version])
|
|
|
|
|
|
if tls is True and not advanced_opts:
|
|
|
return True
|
|
@@ -35,7 +55,8 @@ def tls_config_from_options(options):
|
|
|
|
|
|
return TLSConfig(
|
|
|
client_cert=client_cert, verify=verify, ca_cert=ca_cert,
|
|
|
- assert_hostname=False if skip_hostname_check else None
|
|
|
+ assert_hostname=False if skip_hostname_check else None,
|
|
|
+ ssl_version=tls_version
|
|
|
)
|
|
|
|
|
|
return None
|