2014-11-10 7 views
23

Ich versuche, eine sichere Socket-Verbindung in Python herzustellen, und ich habe eine harte Zeit mit dem SSL-Bit davon. Ich habe einige Codebeispiele gefunden, wie man eine Verbindung mit SSL herstellt, aber alle beinhalten Schlüsseldateien. Der Server, mit dem ich mich verbinden möchte, benötigt keine Schlüssel oder Zertifikate. Meine Frage ist, wie ich im Wesentlichen eine Python-Socket-Verbindung mit SSL umschlinge. Ich weiß für eine Tatsache, dass die Verschlüsselung, die ich verwenden soll, ist ADH-AES256-SHA, und das Protokoll ist TLSv1. Dies ist, was ich habe versucht worden:Öffnen einer SSL-Socket-Verbindung in Python

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, ich habe keine Fehler, aber ich erhalte eine leere Antwort. Wenn ich versuche, diesen Code in der Befehlszeile zu debuggen, indem ich python in das Terminal eintippe und Code Zeile für Zeile einfüge, bekomme ich, was ich annahm, ist ein Statuscode, wenn er sock.send(packet) läuft. Die Ganzzahlantwort, die ich bekomme, ist 26. Wenn jemand weiß, was das bedeutet, oder in irgendeiner Weise helfen kann, würde es sehr geschätzt werden. Danke im Voraus!

Antwort

56

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 die ssl_version spezifizierte, die ich in TLSv1 einsetzte, als es ssl.PROTOCOL_TLSv1 sein sollte. Der zweite Fehler war, dass ich nicht auf den gewickelten Socket referenzierte, sondern den von mir erstellten ursprünglichen Socket aufruft. 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 jemand helfen!

+2

Ich habe diesen Fehler: 'ssl.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 Alarm Handshake Fehler ' keine Idee? – Kostanos

+0

Schwer zu sagen, nur von der Ausgabe. Haben Sie das obige Code-Snippet verwendet? Wenn nicht, würde ich eine neue Frage öffnen und den verwendeten Code posten :) – Raffi

+1

[SSL: WRONG_VERSION_NUMBER] falsche Versionsnummer (_ssl.c: 590). Über GNU/Linux (Ubuntu 16.04) –

0

Es ist eine Menge Spaß, diese Probleme zu lösen, aber für mich fand ich, dass die zugrunde liegende Infrastruktur für Python ssl openssl ist. Versuchen Sie, Ihre Zertifikate mit openssl zu validieren 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 Blatt Zertifikat validieren konnte.

Dies war hilfreich.

Eine andere interessante Sache war, dass zwei verschiedene Builds der gleichen Version von Python auf verschiedenen Hosts unterschiedliche Methoden hatten. Einer hatte ssl.get_default_verify_paths() und der andere nicht. Die Lektion hier ist, dass Python ssl auf openssl gebaut ist. Verschiedene zugrunde liegende Bibliotheken geben Ihnen einen anderen Python.

Python SSL basiert auf openssl, um Probleme mit Zertifikaten zuerst in openssl zu lösen.

2

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

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

+1

Denkst du, du könntest ein Beispiel dafür geben, wie man ein Zertifikat oder einen Schlüssel implementiert, anstatt nur zu sagen, keine anonyme Chiffre zu verwenden? –