URL: https://linuxfr.org/forums/programmation-python/posts/utiliser-sslv3-avec-la-bibliothque-ssl-en-python-2 Title: Utiliser SSLv3 avec la bibliothque ssl en python 2 Authors: madem Date: 2018年04月27日T11:59:47+02:00 License: CC By-SA Tags: openssl, ssl et python2 Score: 1 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