@@ -41,19 +41,37 @@ def get_cert(self, host, port, socks_host=None, socks_port=None):
4141 socket .socket = socks .socksocket
4242
4343 sock = socket .socket (socket .AF_INET , socket .SOCK_STREAM )
44- osobj = SSL .Context (SSL .TLSv1_2_METHOD )
4544 sock .settimeout (5 )
4645 sock .connect ((host , int (port )))
4746 sock .settimeout (None )
48- oscon = SSL .Connection (osobj , sock )
49- oscon .set_tlsext_host_name (host .encode ())
50- oscon .set_connect_state ()
51- oscon .do_handshake ()
52- cert = oscon .get_peer_certificate ()
53- resolved_ip = socket .gethostbyname (host )
54- sock .close ()
55-
56- return cert , resolved_ip
47+
48+ # Try different TLS versions in order of preference (newest to oldest)
49+ tls_methods = [
50+ (SSL .TLSv1_2_METHOD , "TLS 1.2" ), # TLS 1.2
51+ (SSL .TLSv1_1_METHOD , "TLS 1.1" ), # TLS 1.1
52+ (SSL .TLSv1_METHOD , "TLS 1.0" ), # TLS 1.0
53+ ]
54+
55+ for tls_method , tls_version in tls_methods :
56+ try :
57+ osobj = SSL .Context (tls_method )
58+ oscon = SSL .Connection (osobj , sock )
59+ oscon .set_tlsext_host_name (host .encode ())
60+ oscon .set_connect_state ()
61+ oscon .do_handshake ()
62+ cert = oscon .get_peer_certificate ()
63+ resolved_ip = socket .gethostbyname (host )
64+ sock .close ()
65+ return cert , resolved_ip , tls_version
66+ except SSL .SysCallError as e :
67+ # If this TLS version fails, try the next one
68+ continue
69+ except Exception as e :
70+ # For other exceptions, try the next TLS version
71+ continue
72+
73+ # If all TLS versions fail, raise the last exception
74+ raise SSL .SysCallError ("Failed to establish SSL connection with any supported TLS version" )
5775
5876 def border_msg (self , message ):
5977 """Print the message in the box."""
@@ -122,14 +140,15 @@ def get_cert_sans(self, x509cert):
122140 san = san .replace (',' , ';' )
123141 return san
124142
125- def get_cert_info (self , host , cert , resolved_ip ):
143+ def get_cert_info (self , host , cert , resolved_ip , tls_version = None ):
126144 """Get all the information about cert and create a JSON file."""
127145 context = {}
128146
129147 cert_subject = cert .get_subject ()
130148
131149 context ['host' ] = host
132150 context ['resolved_ip' ] = resolved_ip
151+ context ['tls_version' ] = tls_version
133152 context ['issued_to' ] = cert_subject .CN
134153 context ['issued_o' ] = cert_subject .O
135154 context ['issuer_c' ] = cert .get_issuer ().countryName
@@ -186,6 +205,7 @@ def print_status(self, host, context, analyze=False):
186205 print ('\t \t Valid from: {}' .format (context [host ]['valid_from' ]))
187206 print ('\t \t Valid to: {} ({} days left)' .format (context [host ]['valid_till' ], context [host ]['valid_days_to_expire' ]))
188207 print ('\t \t Validity days: {}' .format (context [host ]['validity_days' ]))
208+ print ('\t \t TLS Version: {}' .format (context [host ]['tls_version' ]))
189209 print ('\t \t Certificate valid: {}' .format (context [host ]['cert_valid' ]))
190210 print ('\t \t Certificate S/N: {}' .format (context [host ]['cert_sn' ]))
191211 print ('\t \t Certificate SHA1 FP: {}' .format (context [host ]['cert_sha1' ]))
@@ -238,11 +258,11 @@ def show_result(self, user_args):
238258 print ('{}Socks proxy enabled, connecting via proxy{}\n ' .format (Clr .YELLOW , Clr .RST ))
239259
240260 socks_host , socks_port = self .filter_hostname (user_args .socks )
241- cert , resolved_ip = self .get_cert (host , port , socks_host , socks_port )
261+ cert , resolved_ip , tls_version = self .get_cert (host , port , socks_host , socks_port )
242262 else :
243- cert , resolved_ip = self .get_cert (host , port )
263+ cert , resolved_ip , tls_version = self .get_cert (host , port )
244264
245- context [host ] = self .get_cert_info (host , cert , resolved_ip )
265+ context [host ] = self .get_cert_info (host , cert , resolved_ip , tls_version )
246266 context [host ]['tcp_port' ] = int (port )
247267
248268 # Analyze the certificate if enabled
0 commit comments