@ -106,6 +106,33 @@ try:
except ImportError :
except ImportError :
HAS_SSLCONTEXT = False
HAS_SSLCONTEXT = False
# Select a protocol that includes all secure tls protocols
# Exclude insecure ssl protocols if possible
# If we can't find extra tls methods, ssl.PROTOCOL_TLSv1 is sufficient
PROTOCOL = ssl . PROTOCOL_TLSv1
if not HAS_SSLCONTEXT and HAS_SSL :
try :
import ctypes , ctypes . util
except ImportError :
# python 2.4 (likely rhel5 which doesn't have tls1.1 support in its openssl)
pass
else :
libssl_name = ctypes . util . find_library ( ' ssl ' )
libssl = ctypes . CDLL ( libssl_name )
for method in ( ' TLSv1_1_method ' , ' TLSv1_2_method ' ) :
try :
libssl [ method ]
# Found something - we'll let openssl autonegotiate and hope
# the server has disabled sslv2 and 3. best we can do.
PROTOCOL = ssl . PROTOCOL_SSLv23
break
except AttributeError :
pass
del libssl
HAS_MATCH_HOSTNAME = True
HAS_MATCH_HOSTNAME = True
try :
try :
from ssl import match_hostname , CertificateError
from ssl import match_hostname , CertificateError
@ -304,7 +331,7 @@ class CustomHTTPSConnection(httplib.HTTPSConnection):
if HAS_SSLCONTEXT :
if HAS_SSLCONTEXT :
self . sock = self . context . wrap_socket ( sock , server_hostname = self . host )
self . sock = self . context . wrap_socket ( sock , server_hostname = self . host )
else :
else :
self . sock = ssl . wrap_socket ( sock , keyfile = self . key_file , certfile = self . cert_file , ssl_version = ssl. PROTOCOL_TLSv1 )
self . sock = ssl . wrap_socket ( sock , keyfile = self . key_file , certfile = self . cert_file , ssl_version = PROTOCOL)
class CustomHTTPSHandler ( urllib2 . HTTPSHandler ) :
class CustomHTTPSHandler ( urllib2 . HTTPSHandler ) :
@ -514,7 +541,7 @@ class SSLValidationHandler(urllib2.BaseHandler):
if context :
if context :
ssl_s = context . wrap_socket ( s , server_hostname = proxy_parts . get ( ' hostname ' ) )
ssl_s = context . wrap_socket ( s , server_hostname = proxy_parts . get ( ' hostname ' ) )
else :
else :
ssl_s = ssl . wrap_socket ( s , ca_certs = tmp_ca_cert_path , cert_reqs = ssl . CERT_REQUIRED , ssl_version = ssl. PROTOCOL_TLSv1 )
ssl_s = ssl . wrap_socket ( s , ca_certs = tmp_ca_cert_path , cert_reqs = ssl . CERT_REQUIRED , ssl_version = PROTOCOL)
match_hostname ( ssl_s . getpeercert ( ) , self . hostname )
match_hostname ( ssl_s . getpeercert ( ) , self . hostname )
else :
else :
raise ProxyError ( ' Unsupported proxy scheme: %s . Currently ansible only supports HTTP proxies. ' % proxy_parts . get ( ' scheme ' ) )
raise ProxyError ( ' Unsupported proxy scheme: %s . Currently ansible only supports HTTP proxies. ' % proxy_parts . get ( ' scheme ' ) )
@ -523,7 +550,7 @@ class SSLValidationHandler(urllib2.BaseHandler):
if context :
if context :
ssl_s = context . wrap_socket ( s , server_hostname = self . hostname )
ssl_s = context . wrap_socket ( s , server_hostname = self . hostname )
else :
else :
ssl_s = ssl . wrap_socket ( s , ca_certs = tmp_ca_cert_path , cert_reqs = ssl . CERT_REQUIRED , ssl_version = ssl. PROTOCOL_TLSv1 )
ssl_s = ssl . wrap_socket ( s , ca_certs = tmp_ca_cert_path , cert_reqs = ssl . CERT_REQUIRED , ssl_version = PROTOCOL)
match_hostname ( ssl_s . getpeercert ( ) , self . hostname )
match_hostname ( ssl_s . getpeercert ( ) , self . hostname )
# close the ssl connection
# close the ssl connection
#ssl_s.unwrap()
#ssl_s.unwrap()