Python + SSL para aplicações simples
Precisei relembrar uma forma de gerar uma conexão SSL(não apenas a camada de aplicação) para um projeto. O python faz isso de forma muito fluida e simples. Não requer prática, tampouco habilidade haha.
Para gerar o certificado, primeiro geramos uma chave com o openssl. Depois a usamos para gerar um certificado. Uma forma direta e automatica(e insegura, ja que não ha dados no certificado gerado) de fazer isso é:
openssl genrsa -out key.pem yes '' | openssl req -new -x509 -key key.pem -out crt.pem -days 36500 || exit 1 cat key.pem crt.pem > cert.pem rm key.pem crt.pem
Lembrando que estou ignorando as entradas para gerar o cert. Este tipo de coisa é mais usado para automatizar e gerar um cert novo a cada sessão. Depois disto é necessario pegar o fingerprint da chave, assim:
openssl x509 -in cert.pem -md5 -fingerprint -noout | sed 's/^[^=]\+=//;s/://g' | tr 'A-Z' 'a-z'
Agora o servidor, extremamente simples, para apenas uma conexão e printar o dado enviado:
import socket, ssl
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('', 8081))
sock.listen(1)
newsock, fromaddr = sock.accept()
conn = ssl.wrap_socket(newsock, server_side=True, certfile='cert.pem', keyfile='cert.pem')
conn.setblocking(0)
while True:
try:
buf = conn.read(512)
if buf == '':
break
else:
print buf
except:
pass
O cliente é tão simples quanto o servidor. Só lembrar de pegar o fingerprint gerado e usar no client. Ele verifica e só loga no servidor se bater o fingerprint.
import socket, ssl, hashlib, time
CERT="fingerprint que voce pegou"
sock = socket.socket()
sock.settimeout(2)
sock.connect(('localhost', 8081))
conn = ssl.wrap_socket(sock)
if hashlib.md5(conn.getpeercert(True)).hexdigest() != CERT:
conn.close()
print 'CERT diferente do esperado, tentando me hackearrrrrrr'
else:
print '200 OK'
time.sleep(2)
conn.write('CHUPA ESSA MANGA, WIRESHARK!1!!')
print 'enviado'
conn.close()
E é só isso, bem simples. É uma forma de encriptação e autenticação bem razoavel e resolve para a maioria das aplicações práticas contemporaneas.
link dos sources em : https://github.com/paoloo/simple-ssl