Python SSL для подключения к Cloudflare 1.1.1.1 с использованием DNS через TLS - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь подключиться к Cloudflare 1.1.1.1, используя DNS поверх TLS, используя библиотеку ssl в python 3.6. К сожалению, код выполняется, но по сокету ничего не получено. Соединение успешно устанавливается с адресом 1.1.1.1:853. Переменная message содержит шестнадцатеричное представление полезной нагрузки DNS-запроса в соответствии с RFC.

Запрашивает IP-адрес для www.example.com

import socket
import ssl
import binascii

HOST, PORT = '1.1.1.1', 853

def send_message(_message, sock):
    __message = _message.replace(" ", "").replace("\n", "")
    ms = __message
    print(ms)
    m = binascii.unhexlify(ms)
    print(m)
    sock.send(m)
    data = sock.recv(4096)
    print(data)
    return binascii.hexlify(data).decode("utf-8")

def connect():
    # CREATE SOCKET
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.settimeout(100)

    # WRAP SOCKET
    context = ssl.create_default_context()
    context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
    context.verify_mode = ssl.CERT_REQUIRED
    #context.load_cert_chain(keyfile='/etc/ssl/certs/cloudflare.key')
    context.load_verify_locations('/etc/ssl/certs/ca-
certificates.crt')

    wrappedSocket = context.wrap_socket(sock, server_hostname=HOST)

    # CONNECT AND PRINT REPLY
    wrappedSocket.connect((HOST, PORT))
    print(wrappedSocket.getpeercert())

    # CLOSE SOCKET CONNECTION
    return wrappedSocket


def format_hex(hex):
    """format_hex returns a pretty version of a hex string"""
    octets = [hex[i:i+2] for i in range(0, len(hex), 2)]
    pairs = [" ".join(octets[i:i+2]) for i in range(0, len(octets), 2)]
    return "\n".join(pairs)


message = "00 3a AA AA 01 00 00 01 00 00 00 00 00 00 " \
"07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 00 01 00 01"

conn = connect()
response = send_message(message, conn)
print(format_hex(response))

Любой намек был бы отличным, спасибо.

...