Forum Programmation.python Utiliser SSLv3 avec la bibliothque ssl en python 2

Posté par . Licence CC By‐SA.
Étiquettes :
1
27
avr.
2018

Bonjour, je cherche à faire un programme en python 2.7 (en utilisant uniquement des bibliothèque de la librairie standard) afin de déterminer les versions de SSL/TLS supportés par un site web.

Voici mon code (en mode un peu brouillon). Pour des soucis de clarté, je teste uniquement le cipher suite RC4-SHA ici

 #encoding=utf-8
 import ssl
 import socket
 import traceback
 import logging
 import sys
 import json
 class AnalyseSSL:
 cipher_list="RC4-SHA".split(":") 
 list_version_ssl_tls = [
 ("SSLv2", ssl.OP_ALL | ssl.OP_NO_SSLv3 | ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1 | ssl.OP_NO_TLSv1_2),
 ("SSLv3", ssl.OP_ALL | ssl.OP_NO_SSLv2 | ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1 | ssl.OP_NO_TLSv1_2),
 ("TLSv1", ssl.OP_ALL | ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3 | ssl.OP_NO_TLSv1_1 | ssl.OP_NO_TLSv1_2),
 ("TLSv1_1", ssl.OP_ALL | ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3 | ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_2),
 ("TLSv1_2", ssl.OP_ALL | ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3 | ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1),
]
def __init__(self, hostname, port):
 self.hostname = hostname
 self.port = port
# try to connect to the hostname with all cipher suite for each SSL/TLS version
def try_all_ssl_tls_version(self):
 logging.warning("---------------------------------------- %s", port)
 nb_tentative_max = 5
 cpt_tentative_max = 0
 resultat = {}
 try:
 print 'hostname : ', hostname
 for version in self.list_version_ssl_tls: # Pour chaque version de SSL/TLS
 cpt_nb_tentative_max = 0
 is_version_supported = False
 if cpt_tentative_max >= 5:
 break;
 for cipher_suite in self.cipher_list: # Pour chaque cipher suite
 print cipher_suite
 context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH) # création du context
 context.check_hostname = False
 context.verify_mode = ssl.CERT_NONE
 context.options = version[1] # on spécifie la version de SSL/TLS qu'on veut utiliser
 print context.options
 try:
 context.set_ciphers(cipher_suite) # on spécifie la cipher suite à utiliser
 except Exception as e:
 print "Exception : ", e
 pass 
 traceback.print_exc(e)
 s_ = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 s = context.wrap_socket(s_)
 #s = context.wrap_socket(s_, server_hostname=hostname)
 #print "timeout : ", s.gettimeout()
 s.settimeout(5)
 #print "timeout : ", s.gettimeout()
 try:
 s.connect((hostname, port)) # on tente de se connecter
 if (is_version_supported == False):
 print version[0], "supporté"
 is_version_supported = True
 print s.cipher()
 #logging.info("---------------------------------------- %s %s", %(version[0], s.cipher()))
 s.close()
 except socket.timeout:
 cpt_tentative_max += 1
 if cpt_tentative_max >= 5:
 break;
 except Exception as e: # si la connexion a échoué
 #print "[version ", version[0], " with ", cipher_suite, " :: ", e
 #print s.getpeercert()
 #traceback.print_exc(e)
 print e
 pass
 if is_version_supported == False:
 print version[0], "non supporté"
 print "\n"
 except Exception as e:
 print e
 traceback.print_exec(e)
 pass
hostname = 'PUT YOUR IP HERE'
port = 443
A = AnalyseSSL(hostname, port)
A.try_all_ssl_tls_version()

Le problème c'est que je ne peux jamais établir de connection utilisant SSL3. J'ai une ip dont je suis sur à 1000% qu'elle accepte du SSL3 avec le cipher suite RC4-SHA (testé avec d'autre outils comme sslyze, testssl nottament).
Mais impossible avec mon script d'établir une connexion SSL 3 avec ce cipher suite depuis mon script.
Mon script fonctionne bien pour toutes les versions de TLS, mais dès que je veux utiliser SSL, j'ai l'erreur suivante :

[SSL: UNSUPPORTED_PROTOCOL] unsupported protocol (_ssl.c:581)
```Pourquoi ne puis-je pas utiliser SSL3 ? (j'ai recompiler la librairie openssl en ajoutant les flags me permettant justement d'utiliser ssl3). La preuve, lorsque je lance la commande suivante sur la même ip, j'arrive bien a me connecter.

openssl s_client -connect IP -ssl3 -ciphers RC4-SHA
```Comment suis-je sensé résoudre ce problème ?

Cordialement

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.