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!
26
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.
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