SSLv3 соединение с библиотекой ssl в Python
Я хочу создать программу (Python 2.7), которая определяет версию ssl/tls, доступную на веб-сайте. И я просто хочу использовать стандартные библиотеки Python.
Вот мой код:
#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()
Проблема в том, что я не могу установить соединение sslv3. У меня есть ip (и я уверен, что sslv3 включен на этом ip с помощью набора шифров RC4-SHA, я проверил его с помощью openssl и testssl.sh).
Моя программа работает нормально для третьей версии tls, но невозможно использовать sslv3 или sslv2. Вот ошибка, которую я получил:
[SSL: UNSUPPORTED_PROTOCOL] unsupported protocol (_ssl.c:581)
Я не могу использовать SSLv3, но почему? (Я перекомпилирую свою библиотеку openssl, чтобы включить sslv3, и она работает, потому что, если я использую:
openssl s_client -connect IP -ssl3 -ciphers RC4-SHA
это работает.
Как я могу решить это? Спасибо:)
2 ответа
openssl s_client -ssl3 -tls1.2
попробуйте добавить в tls1.2, у меня была та же проблема с моим Linux, когда я использовал TLS 1.2, он работал нормально
А в других Linux это не сработало, поэтому я деактивировал проверку SSL-сертификата
Попытайтесь установить правильный context.minimum_version для каждого запроса, чтобы избежать ошибки неподдерживаемого протокола и / или случайного закрытия соединения со стороны сервера.
Возникла исключительная ситуация, в которой говорится, что SSL3 является неподдерживаемым протоколом.
RC4-SHA
Traceback (most recent call last):
File "test.py", line 72, in try_all_ssl_tls_version
s.connect((hostname, port)) # on tente de se connecter
File "/usr/local/lib/python2.7/ssl.py", line 882, in connect
self._real_connect(addr, False)
File "/usr/local/lib/python2.7/ssl.py", line 873, in _real_connect
self.do_handshake()
File "/usr/local/lib/python2.7/ssl.py", line 846, in do_handshake
self._sslobj.do_handshake()
SSLError: [SSL: UNSUPPORTED_PROTOCOL] unsupported protocol (_ssl.c:726)
[SSL: UNSUPPORTED_PROTOCOL] unsupported protocol (_ssl.c:726)
SSLv3 non supporté