Подтвердить что ты не робот

Открытие соединения сокетов SSL в Python

Я пытаюсь установить безопасное соединение сокета в Python, и мне сложно с ним бить SSL. Я нашел несколько примеров кода, как установить соединение с SSL, но все они связаны с ключевыми файлами. Сервер, с которым я пытаюсь подключиться, не нуждается в получении каких-либо ключей или сертификатов. Мой вопрос заключается в том, как я могу по существу связать соединение сокетов python с SSL. Я знаю, что шифр, который я должен использовать, - ADH-AES256-SHA, а протокол - TLSv1. Это то, что я пытался:

import socket
import ssl

# SET VARIABLES
packet, reply = "<packet>SOME_DATA</packet>", ""
HOST, PORT = 'XX.XX.XX.XX', 4434

# CREATE SOCKET
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(10)

# WRAP SOCKET ???
ssl.wrap_socket(sock, ssl_version="TLSv1", ciphers="ADH-AES256-SHA")

# CONNECT AND PRINT REPLY
sock.connect((HOST, PORT))
sock.send(packet)
print sock.recv(1280)

# CLOSE SOCKET CONNECTION
sock.close()

Когда я запускаю этот код, я не получаю никаких ошибок, но получаю пустой ответ. При попытке отладки этого кода в командной строке, введя python в терминал и вставляя код по очереди, я получаю то, что я предполагаю, это код состояния при запуске sock.send(packet). Integer ответ, который я получаю, равен 26. Если кто-то знает, что это значит, или может помочь в любом случае, это будет очень признательно. Спасибо заранее!

4b9b3361

Ответ 1

Хорошо, я понял, что случилось. Это было глупо с моей стороны. У меня были проблемы с моим кодом two. Моя первая ошибка заключалась в том, что при указании ssl_version я поставил TLSv1, когда он должен был быть ssl.PROTOCOL_TLSv1. Вторая ошибка заключалась в том, что я не ссылался на упакованный сокет, вместо этого я вызывал исходный сокет, который я создал. Следующий код, похоже, работал у меня.

import socket
import ssl

# SET VARIABLES
packet, reply = "<packet>SOME_DATA</packet>", ""
HOST, PORT = 'XX.XX.XX.XX', 4434

# CREATE SOCKET
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(10)

# WRAP SOCKET
wrappedSocket = ssl.wrap_socket(sock, ssl_version=ssl.PROTOCOL_TLSv1, ciphers="ADH-AES256-SHA")

# CONNECT AND PRINT REPLY
wrappedSocket.connect((HOST, PORT))
wrappedSocket.send(packet)
print wrappedSocket.recv(1280)

# CLOSE SOCKET CONNECTION
wrappedSocket.close()

Надеюсь, это поможет кому-то!

Ответ 2

Вам не следует устанавливать PROTOCOL_TLSv1 (или TLSv1). Это ограничивает соединение только с TLS v1.0. Вместо этого вы хотите PROTOCOL_TLS (или устаревший PROTOCOL_SSLv23), который поддерживает все версии, поддерживаемые библиотекой.

Вы используете анонимный шифр, потому что по какой-то причине вы считаете, что вам не нужен сертификат или ключ. Это означает, что аутентификация сервера отсутствует и что вы уязвимы для человека в средней атаке. Если вы действительно не знаете, что делаете, я предлагаю вам не использовать анонимные шифры (например, ADH-AES256-SHA).

Ответ 3

Нам очень понравилось решать эти проблемы, но для меня я обнаружил, что базовая инфраструктура для python ssl - openssl. Попробуйте проверить свои сертификаты с помощью openssl и сделайте это, прежде чем пытаться использовать python для использования того же стека.

Мне нужно было импортировать корневой сертификат в openssl, прежде чем я смогу проверить сертификат листа.

Это было полезно.
http://gagravarr.org/writing/openssl-certs/others.shtml#ca-openssl

Еще одна интересная вещь заключалась в том, что две разные версии одной и той же версии python на разных хостах имели разные методы. У одного был ssl.get_default_verify_paths(), а другой нет. Урок состоит в том, что python ssl построен на openssl. Различные базовые библиотеки дают вам другой питон.

Python SSL построен на openssl, поэтому сначала разрешите проблемы с сертификатами в openssl.