Abrir uma ligação de 'socket' de SSL em Python

Estou a tentar estabelecer uma ligação segura do 'socket' em Python, e estou a ter dificuldades com a parte do SSL. Eu encontrei alguns exemplos de código de como estabelecer uma conexão com SSL, mas todos eles envolvem arquivos chave. O servidor com o qual estou a tentar ligar não precisa de receber chaves ou certificados. A minha pergunta é como é que eu, essencialmente, enrolo uma ligação do 'socket' python com o SSL. Eu sei que a cifra que devo usar é ADH-AES256-SHA, e o protocolo é TLSv1. Presente é o que tenho tentado.
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()
Quando corro este código, Não tenho erros, mas tenho uma resposta em branco. Ao tentar depurar este código na linha de comandos, escrevendo python no terminal e colando em código Linha A linha, obtenho o que estou a assumir ser um código de Estado ao executar sock.send(packet). A resposta inteira que recebo é 26. Se alguém sabe o que isso significa, ou pode ajudar de qualquer maneira, seria muito apreciado. Obrigado antecipadamente!

Author: Raffi, 2014-11-10

3 answers

Pronto, descobri o que se passava. Foi uma tolice da minha parte. Tive problemas com o meu código. O meu primeiro erro foi ao especificar o ssl_version que eu coloquei em TLSv1 quando deveria ter sido ssl.PROTOCOL_TLSv1. O segundo erro foi que eu não estava referenciando o socket embrulhado, em vez disso eu estava chamando o socket original que eu criei. O código abaixo parecia funcionar para mim.
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()
Espero que isto possa ajudar alguém!
 63
Author: Raffi, 2014-11-10 19:40:39

Não devias estar a marcar {[[0]} (ou TLSv1). Isto restringe a ligação apenas a TLS v1.0. Em vez disso, deseja PROTOCOL_TLS (ou o PROTOCOL_SSLv23 desactualizado) que suporta todas as versões suportadas pela biblioteca.

Estás a usar uma cifra anónima, porque por alguma razão achas que não precisas de um certificado ou chave. Isso significa que não há autenticação do servidor e que você está vulnerável a um homem no ataque do meio. A não ser que saibas o que estás a fazer, sugiro-te não use Cifras anônimas (como ADH-AES256-SHA).
 3
Author: Kurt Roeckx, 2018-03-17 16:58:31

É muito divertido ter que resolver estes problemas, mas para mim, descobri que a infra-estrutura subjacente para o ssl python é o openssl. Tente validar os seus certificados com o openssl e faça isto antes de tentar que o python use a mesma pilha.

Precisava de importar um certificado de raiz para o openssl antes de poder validar o certificado de folha.

Isto foi ... útil.
http://gagravarr.org/writing/openssl-certs/others.shtml#ca-openssl Outra coisa interessante foi que duas versões diferentes da mesma versão do python em hosts diferentes tinham métodos diferentes. Um tinha e o outro não tinha nenhum. A lição aqui é que o ssl python é construído em openssl. Bibliotecas subjacentes diferentes lhe dão uma python diferente.

O SSL Python é construído sobre o openssl para resolver problemas de certificados no openssl primeiro.

 0
Author: Bryant Bernstein, 2018-03-12 17:10:26