web-dev-qa-db-fra.com

Ouverture d'une connexion de socket SSL en Python

J'essaie d'établir une connexion de socket sécurisée en Python, et j'ai du mal à utiliser le bit SSL. J'ai trouvé des exemples de code sur la façon d'établir une connexion avec SSL, mais ils impliquent tous des fichiers de clés. Le serveur avec lequel je tente de me connecter n'a pas besoin de recevoir de clé ni de certificat. Ma question est la suivante: comment puis-je envelopper une connexion de socket python avec SSL? Je sais pertinemment que le chiffrement que je suis censé utiliser est ADH-AES256-SHA et que le protocole est TLSv1. C'est ce que j'ai essayé:

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()

Lorsque je lance ce code, je ne reçois aucune erreur, mais ma réponse est vide. En essayant de déboguer ce code dans la ligne de commande, en tapant python dans le terminal et en le collant ligne par ligne, j'obtiens ce que je suppose en tant que code d'état lorsque sock.send(packet) est exécuté. La réponse entière que je reçois est 26. Si quelqu'un sait ce que cela signifie, ou peut aider de toute façon, ce serait grandement apprécié. Merci d'avance!

27
Raffi

Ok, j'ai compris ce qui n'allait pas. C'était un peu idiot de ma part. J'ai eu two problèmes avec mon code. Ma première erreur a été de spécifier le ssl_version que j’ai mis dans TLSv1 alors que cela aurait dû être ssl.PROTOCOL_TLSv1. La deuxième erreur est que je ne faisais pas référence au socket encapsulé, mais que j'appelais le socket original que j'ai créé. Le code ci-dessous semblait fonctionner pour moi.

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()

J'espère que cela peut aider quelqu'un!

67
Raffi

Vous ne devriez pas configurer PROTOCOL_TLSv1 (ou TLSv1). Cela limite la connexion à TLS v1.0 uniquement. À la place, vous voulez PROTOCOL_TLS (ou le PROTOCOL_SSLv23 obsolète) qui prend en charge toutes les versions prises en charge par la bibliothèque.

Vous utilisez un chiffre anonyme, parce que pour une raison quelconque, vous pensez que vous n’avez pas besoin d’un certificat ou d’une clé. Cela signifie qu'il n'y a pas d'authentification du serveur et que vous êtes vulnérable à une attaque entre deux personnes. À moins que vous ne sachiez vraiment ce que vous faites, je vous suggère de ne pas utiliser de chiffrement anonyme (comme ADH-AES256-SHA).

4
Kurt Roeckx

Il est très amusant de résoudre ces problèmes, mais pour moi, j’ai constaté que l’infrastructure sous-jacente de python ssl est openssl. Essayez de valider vos certificats avec openssl et ceci avant d’essayer d’obtenir que python utilise cette même pile. 

Je devais importer un certificat racine dans openssl avant de pouvoir valider le certificat feuille.

C'était utile.
http://gagravarrarr.org/writing/openssl-certs/others.shtml#ca-openssl

Une autre chose intéressante est que deux versions différentes de la même version de Python sur des hôtes différents avaient des méthodes différentes. L'un avait ssl.get_default_verify_paths() et l'autre n'en avait pas du tout. La leçon à tirer est que python ssl est construit sur openssl. Différentes bibliothèques sous-jacentes vous donnent un python différent. 

Python SSL est construit sur openssl, alors résolvez d’abord les problèmes de certificat dans openssl.

0
Bryant Bernstein