Henryk Plötz: Probleme mit POST Header (multipart/form-data)

Beitrag lesen

Moin,

Kann ich ja nicht ahnen das sowas geht ;-)

Naja, der Rechner muss doch auch irgendwie an die Informationen kommen, oder? Und da die wenigsten Computer über übersinnliche Fähigkeiten oder Intelligenz verfügen, müsste ein Mensch das doch allemal können.

Was denn jetzt, kannst du das im Klartext lesen oder nicht? Wenn nicht nehem ich auch kein Ethernal, das habe ich schonmal probiert und habe in 10 Minuten kein stück herausgefunden wie das blöde Ding funktioniert!

Also, du klickst auf Capture und suchst dir ein Interface aus (idealerweise das worüber die Daten gehen ;). Unter Windows heissen die alle so komisch, im Zweifelsfall probierst' halt alle durch. Dann lässt du ihn aufzeichnen und stoppst später die Aufzeichnung. Vor dir siehst du jetzt alle Pakete die im fraglichen Zeitraum an dir vorbeigezogen sind. Die kannst du dir jetzt einzeln ansehen und siehst unten in einer Baumansicht alle Header aufgeschlüsselt. Du kannst auch eines der Pakete einer TCP-Verbindung anklicken, rechts klicken und dann Follow TCP-stream auswählen, dann kriegst du die Nutzdaten der jeweiligen TCP-Verbindung (also zum Beispiel den HTTP-Dialog) in einem extra Fenster ohne das TCP/IP-Beiwerk dargestellt. Ausserdem wird ein Filter gesetzt, der nur noch Pakete dieser Verbindung anzeigt, den kannst du rechts unten mit Reset wieder ausschalten. Du kannst im Feld daneben auch eigene Filter eingeben, die Syntax ist (imho) perl-ähnlich: tcp.port eq 80 zeigt zum Beispiel nur TCP-Pakete an die von oder zu Port 80 (also HTTP) gegangen sind. Mehr Ausdrücke findest du in der Hilfe.

Und den Zeigt ethernal an? Oder mußt DU den erst durch ein eigenes Script schicken?

Ja, es zeigt sowohl die Binärdaten an, als auch die dekodierte Version. Wenn du etwas in der dekodierten Version markierst, markiert es sogar freundlicherweise die selbe Stelle in den Binärdaten.

Gibt´s eine PHP-Funktion die sowas entschlüsseln kann?

Noe, aber du kannst mit dem Wissen aus den RFCs 791, 793 und vielleicht noch 3168 eine Funktion schreiben.

Aber warum schreiben die das dann bei news.txt mit rein???

Es gibt Dinge zwischen Himmel und Erde...

OK. soweit in der Theorie. Soll also heißen das ich mich  um alles selbst kümmern muß, also dass keine SSL Verbindung einmal zu Stande kommt sondern das ich immer manuell bverschlüsseln muß, richtig?

Genau.

Wobei sich mir da die Frage stellt ob ich dann bei SSL bleibe, denn gerade bei openSSL ist ja die ein oder andere Sicherheitslücke bekannt, und wenn man das eh manuell macht, dann wäre vielleicht GPG doch die bessere Variante, oder?

Oehm, von einer OpenSSL-Sicherheitslücke (ausser den bekannten und längst korrigierten ;) weiss ich nichts. Du würdest auch auch gar kein OpenSSL benutzen, sondern nur den Verschlüsselungsteil davon (so wie mcrypt bloss anders). Aber GPG scheint mir doch die bessere Idee, ja.

Du würdest dann einfach gpg -c benutzen, was aber unter Umständen auch wieder an popen()-Problemen krankt.

Mein erstes praktisches Problem, wie erstelle ich die Schlüssel?

Da die Funktionen nicht dokumentiert sind, kann ich dazu auch nicht allzuviel sagen.

openssl_pkey_new () erzeugt also einen privaten schlüssel. Das mache ich dann mal auf beiden Servern und habe jeweils private schlüssel, die ich dann in einer Datei ablege, oder direkt im Script speichere.

Du brauchst jeweils Privater Schlüssel/Öffentlicher Schlüssel für jede Richtung, ja.

Dann gehen die Probleme los - wie komme ich an die öffentlichen Schlüssel? Hat das vielleicht was hiermit zu tun:
bool openssl_csr_new ( array dn, resource privkey [, array extraattribs [, array configargs]])

Eher nicht. Den Certificate Sign Request brauchst du nur, wenn du deinen öffentlichen Schlüssel von einer Certification Authority unterschreiben lassen willst.

Da ich bei den PHP-Funktionen nichts dazu finde, könntest du dich direkt mal bei OpenSSL umsehen. Da ist ein kleines Kommandozeilentool bei, dass das Schlüsselerzeugen und Speichern können sollte.

Sagen wir mal ich hätte jetzt beide Schlüssel und würde die jeweils in einer Datei speichern. Dann baue ich aber ein Verbindung zum normalen HTTP-Server auf an Port 80? Nur stehe ich dann wieder vor dem Problem, der verschlüsselte String ist vermutlich binär, also muß ich das wieder wie bei gz als Datei-Upload tarnen oder was? Also dann den Sitzungsschlüssel als POST-Variable übertragen, und den ssl-String als weitere POST-Variable mit multipart/form-data und boundary...

Genau.

Aber ich habe SSL immer anders begriffen. Ich dachte SSL sei eine Verschlüsselung auf euner niedrigeren Ebene als der Anwendungs-Ebene als HTTP, das also der komplette http-Traffic so verschlüsselt wird, ich also eine TCP/IP Verbindung zu Port 443 des SSL-Servers herstelle(mit Sitzungsschlüssel und private Key authentifizieren), die SSL-verschlüsselten Daten übertragen und mit den entsprechenden Schlüsseln den kompletten http-Header entschlüsseln und dann normal weiterverarbeiten.

Ist es ja auch. Bloss die OpenSSL-Funktionen die zur Zeit da sind, implementieren nur einen kleinen Teil dessen was OpenSSL kann. Und das ist nunmal leider nur ein Teil des Teils der sich mit Schlüsseln und Verschlüsseln befasst. Eine SSL-Verbindung für HTTPS kannst du damit zur Zeit nicht bauen, dazu müsste wieder (wie bereits mehrfach erwähnt) das OpenSSL-Kommandozeilenprogramm mit Parameter s_client anrücken (popen()-Problem!).

Das was du machen willst (Stream-Verbindung zu einem SSL-Server aufbauen) ist das was in den neuen Codeteilen implementiert wird (oder auch nicht *sigh*).

--
Henryk Plötz
Grüße von der Ostsee