it-swarm.com.de

Öffnen einer SSL-Socket-Verbindung in Python

Ich versuche, eine sichere Socket-Verbindung in Python herzustellen, und ich habe Probleme mit dem SSL-Bit. Ich habe einige Codebeispiele für das Herstellen einer Verbindung mit SSL gefunden, aber alle beinhalten Schlüsseldateien. Der Server, mit dem ich mich verbinden möchte, muss keine Schlüssel oder Zertifikate erhalten. Meine Frage ist, wie ich im Wesentlichen eine Python-Socket-Verbindung mit SSL umwickle. Ich weiß sicher, dass die Chiffre, die ich verwenden soll, ADH-AES256-SHA ist, und das Protokoll TLSv1 ist. Das habe ich versucht:

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

Wenn ich diesen Code ausführen, erhalte ich keine Fehler, aber ich bekomme eine leere Antwort. Wenn Sie versuchen, diesen Code in der Befehlszeile zu debuggen, indem Sie python im Terminal eingeben und Code zeilenweise einfügen, erhalte ich einen Statuscode, wenn Sie sock.send(packet) ausführen. Die ganzzahlige Antwort, die ich erhalte, ist 26. Wenn jemand weiß, was dies bedeutet oder helfen kann, wäre es sehr dankbar. Danke im Voraus!

27
Raffi

Ok, ich habe herausgefunden, was los war. Es war irgendwie dumm von mir. Ich hatte two Probleme mit meinem Code. Mein erster Fehler war, als ich den ssl_version angegeben habe, den ich TLSv1 eingegeben habe, als ssl.PROTOCOL_TLSv1 hätte sein sollen. Der zweite Fehler bestand darin, dass ich nicht auf den umschlossenen Sockel Bezug nahm, sondern den ursprünglich erstellten Sockel anrief. Der folgende Code schien für mich zu funktionieren.

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

Hoffe das kann jemandem helfen!

67
Raffi

Sie sollten nicht PROTOCOL_TLSv1 (oder TLSv1) einstellen. Dies beschränkt die Verbindung nur auf TLS v1.0. Stattdessen möchten Sie PROTOCOL_TLS (oder den veralteten PROTOCOL_SSLv23), der alle von der Bibliothek unterstützten Versionen unterstützt.

Sie verwenden eine anonyme Chiffre, weil Sie aus irgendeinem Grund glauben, Sie benötigen kein Zertifikat oder Schlüssel. Dies bedeutet, dass der Server nicht authentifiziert wird und Sie für einen Mann im mittleren Angriff anfällig sind. Wenn Sie nicht wirklich wissen, was Sie tun, sollten Sie keine anonymen Chiffren verwenden (wie ADH-AES256-SHA).

4
Kurt Roeckx

Es macht sehr viel Spaß, diese Probleme zu lösen, aber für mich habe ich festgestellt, dass die zugrunde liegende Infrastruktur für Python ssl opensl ist. Versuchen Sie, Ihre Zertifikate mit openssl zu überprüfen, und tun Sie dies, bevor Sie versuchen, Python dazu zu bringen, denselben Stack zu verwenden. 

Ich musste ein Stammzertifikat in openssl importieren, bevor ich das Blattzertifikat überprüfen konnte.

Das war hilfreich.
http://gagravarr.org/writing/openssl-certs/others.shtml#ca-openssl

Interessant war auch, dass zwei unterschiedliche Versionen derselben Python-Version auf verschiedenen Hosts unterschiedliche Methoden verwendeten. Einer hatte ssl.get_default_verify_paths() und der andere hatte überhaupt keine. Die Lektion hier ist, dass Python-SSL auf openssl aufgebaut ist. Verschiedene darunterliegende Bibliotheken geben Ihnen einen anderen Python. 

Python SSL basiert auf openssl, also lösen Sie zunächst Zertifikatsprobleme in openssl.

0