Python Verschlüsselte Kommunikation Client-Server (RPC)

Falc410

Vice Admiral
Registriert
Juni 2006
Beiträge
6.420
Ich arbeite gerade an einem Tool bei dem die Hauptentwickler leider nicht mehr da sind. Es ist eine klassische Client-Server Architektur und zwar verbindet sich der Client zum Server, überträgt ein paar Daten und bekommt einen Return Code ob alles empfangen worden ist.

Derzeit wird xmlrpc benutzt um sich zu verbinden. Das ganze wird zwar per SSL verschlüsselt, allerdings funktioniert das nicht richtig. Das Problem ist das es hier auf die verwendete Python Version ankommt. Im Moment läuft alles auf Version 2.6.6 dadurch wird das Zertifikat und der Hostname nicht überprüft. Wenn ich Python Version 2.7.9 benutze (als Client) verbindet er sich nicht, außer man setzt den Context entsprechend: context = ssl._create_unverified_context()

Diese Methode gibt es aber wohl nur in Python 2.7.9 und später - ich habe hier einen OSX Rechner mit 2.7.6 und da gibt es das nicht. Ich habe keine Möglichkeit den Context zu ändern und auch mit viel googlen keine Lösung hierfür gefunden. Daher ist das kompletter Mist wenn der Client nur mit einer einzigen (alten) Python Version funktioniert.

Zusätzlich gibt es auch eine Warning der xmlrpc Library:

Warning
The xmlrpclib module is not secure against maliciously constructed data. If you need to parse untrusted or unauthenticated data see XML vulnerabilities.

Alle unsere Daten sind im Moment untrusted und unauthenticated. Daher würde ich gerne xmlrpc gegen etwas anderes ersetzen damit wir wenigstens authentication einbauen können.

Einen SOAP Service bietet der Server auch schon an - den könnte ich auch benutzen, allerdings bietet der keine Verschlüsselung und auch keine Authorisierung.

Ich habe schon gesucht was es sonst noch gibt und bin auf das hier gestoßen: http://stackoverflow.com/questions/1879971/what-is-the-current-choice-for-doing-rpc-in-python

JSON-RPC hört sich gut an, mit Thrift habe ich auch schon mal gearbeitet, war super. Aber alle diese Sachen bieten weder Verschlüsselung noch Authorisierung an. Was kann ich nun nehmen das relativ einfach zu implementieren ist? Ich würde mich gerne mit einem Token authentifizieren und die Verbindung verschlüsseln damit eben keiner der ein paar Pakete snifft die Daten im Klartext auslesen kann.
 
SSH Tunnel oder VPN.
 
Nein das ist nicht möglich. Die Verbindung muss über das Internet erfolgen am besten über einen einzelnen Port.
 
Und was glaubst die wie SSH und VPNs funktionieren? Briefpost via Brieftauben?
Bei SSH hast du einen einzelnen Server auf einem einzelnen Port, Dito mit VPN wie OpenVPN oder Softether.
 
Lustigerweise geht es hier sogar um OpenVPN und Softether. Aber das kann ich trotzdem nicht benutzen. Es muss innerhalb des Python Codes laufen und irgendein RPC Framework sein.

Ich hab herausgefunden das mit Thrift Verschlüsselung schon geht. Mal schauen ob ich damit weiter komme oder nicht.
 
Na dann SSL Socket mit signierten Zertifikate (howtos genug im Netz) und über den Socket die Daten übertragen oder gleich per Rest Service und HTTPs. Letztere ist die bessere und neuere Lösung.
 
Zurück
Oben