[C] ftplib oder ssl sockets

Ich mach nun etwas länger schon mit Sockets rum.
Jetzt möchte ich das mit Dateien versenden und empfangen zu einem Art Ftp Programm erweitern.
Mir ist das Paket ftplib aufgefallen, welches offensichtlich das Paket ist, welches ich benötige. Ich suche jetzt allerdings schon seit Stunden nach HowTos, Tutorials, oder Examples für diese ftplib, konnte bis jetzt nur für C# und C++ welche finden. Höchstens vllt ein paar kleine Broken von C.

Dann ist mir in den Sinn gekommen, den Dateien Austausch über Sockets zu lösen, doch das ist mir evtl. ein bisschen zu umständlich, da man das bei Pyhton mit ftplib super lösen kann und ich deshalb dachte dass das mit ftplib in C auch so funktioniert. Und wegen der Unsicherheit. Dann kam ich auf SSL, wegen dem Sicherheitsproblem. Jetzt stellen sich bei mir ein paar Fragen zu denen ich leider keine Antworten finden konnte.

- Ist SSL eine Erweiterung für die Sockets, oder ist SSL ein eigener Verbindungsaufbau?
- Wo finde ich Hilfen zu diesem Thema, also SSL und Sockets in C
- Wo finde ich Hilfen zur ftplib in "C"
- Verstehe ich das richtig, das Sockets also TCP im Prinzip die unterste Ebene des Datenaustauschs ist und das je nachdem was man daraus macht so etwas wie HTTP, FTP usw. entsteht? Also das Ftp Clients auch mit Sockets arbeiten?


Wäre super wenn mir da jemand auf die Sprünge helfen könnte.
 
1. SSL ist eine eigene Verbindung, die jenseits von einem normalen Socket stattfindet.
Du kannst SSL nur benutzen, wenn beide Seiten (Client und Server) SSL beherrschen. Es ist gewissermaßen eine Schicht, die allen Traffic der darüber geschickt wird, mit einem Verbindungsschlüssel verschlüsselt, den beide Seiten zu Beginn der Verbindung aushandeln. FTP kann soweit ich weiß kein SSL.

4. TCP ist eine Sicherungsschicht über dem normalen IP Datentransfer. Bei TCP musst du zu Beginn eine Verbindung aufbauen. Dafür kannst du sicherstellen, dass alle Pakete, die du schickst auch ankommen.
Über UDP kannst du auch Netzwerkdaten verschicken, aber du kannst nicht kontrollieren, ob die Gegenseite sie auch bekommt und du brauchst auch keine Verbindung dafür (du feuerst quasi einfach drauf los).
Fast alle „langsamen“ Dienste (E-Mail, HTTP, FTP, SSH, ...) funktionieren mit TCP. Nur Protokolle, bei denen leichter Datenverlust nicht so schlimm ist (z.B: Skype, Streaming oder Filesharing) benutzen auch UDP.

mfg, metax.
 
Ok
Ich möchte nun verschlüsselt, beziehungsweise sicher eine Datei versenden.

Ich google jetzt schon etliche Stunden, nach ftp und ssl.
Außerdem hab ich nach einer crypt verschlüsselung gesucht wie z.B. twofish o.ä.
Ich habe nur ein paar referencen zu SSL gefunden aber keine Tutorials zu ssl oder ftp oder ähnliches. Suche ich falsch, oder was ist mein Fehler?

Wie gesagt ich will eine Datei sicher verschicken lassen. Wenn jemand ganz andere Ansätze weiß, wäre das auch super.
 
ich denke hier fehlen ein par grundlagen ... z.b. was ein schichten modell ist ...

du solltest dir vermutlich entweder mal das OSI modell oder das IP modell (oder beide) zu gemüte führen ... im speziellen den teil der sich mit ip,tcp und udp befasst ...

zu ssl:

ssl/tls ist ein protokoll, dass auf tcp aufsetzt (sprich jeder ssl verbindung liegt eine tcp verbindung zu grunde)

wenn du dir die modelle ansiehst, wirst du feststellen, dass es quasi immer darum geht dinge ein- und auszupacken ...


bisher kennst du möglicherweise das FTP protokoll... die für die übertragung von FTP befehlen nötige verbindung ist eine tcp verbindung ... soll heißen, die daten des FTP protokolls werden via tcp übertragen ... dafür werden sie in "handliche" stücke zerlegt, in tcp pakete verpackt, übertragen, auf der anderen seite wieder ausgepackt, und wieder zusammengesetzt ...

im prinzip passiert bei ssl/tls nichts anderes ... die daten die sicher verschickt werden sollen, werden von ssl in teile geteilt, verschlüsselt, und an das darunterliegende protokoll weitergegeben: tcp. tcp teilt nun wiederum die übergebenen daten in teile, packt sie ein ... überträgt sie ... usw.

wenn du nun eine verbindung willst, die ssl geschützt, dateien übertragen kann, könntest du wie folgt vorgehen:

du ließt die datei in den speicher, und komprimierst sie (oder auch nicht) ...
dann bestimmst du wie groß das ist, was du übertragen willst...
nun fehlt noch ein nachrichten format wie beispielsweise:

-eine kurze feste bitfolge, die dein protokoll identifiziert(feste länge x-byte)
-die länge des dateinamens in byte (ein 16 bit integer)
-der dateiname(zeichenkette ... ascii / unicode)
-die länge der datei in byte (ein 64 bit integer)
-der inhalt der datei(byte folge)


dies wäre eine sehr rudimentäre protokoll spezifikation

eine nachricht die gemäß dieser vorgabe aneinander gereiht wurde, kann wenn man die vorgabe kennt, auch wieder in ihre teile zerlegt werden, und eignet sich eine datei zu übertragen ...

der zugriff auf ssl erfolgt in der regel über eine struktur die den dir bekannten sockets ähnlich ist, das hängt aber von der verwendeten ssl implementation ab ... du gibst die daten deiner nachricht als eine annsammlung von bytes ab, und bekommst sie auf der anderen seite entsprechend als ansammlung von bytes wieder ...


ich würde dir allerdings empfehlen wenn möglich eine objektorientierte sprache zu wählen ... ausser du kannst dir den dadurch entstehenden overhead absolut nicht leisten ...

wenn du eine lib suchst, die dir ssl/tls bietet ... -> openssl

spezifische tutorials solltest du dir erst suchen, wenn du dir sicher bist in welcher sprache du das umsetzen willst ...
 
Vielen Dank für deine Infos,
den Aufbau dachte ich mir ungefähr so, deshalb fragte ich auch am Anfang

"- Verstehe ich das richtig, das Sockets also TCP im Prinzip die unterste Ebene des Datenaustauschs ist und das je nachdem was man daraus macht so etwas wie HTTP, FTP usw. entsteht? Also das Ftp Clients auch mit Sockets arbeiten?"

Ich hab mir nun noch mal diverse Artikel über IP/TCP, SSL und FTP durchgelesen.

Die Sache ist, das ich ein Programm, hab welches schon relativ groß und ausführlich ist (es regelt diverse Dinge über Ein-Ausschaltzeiten, Protokolle usw. an einem Rechner). Diesen wollte ich jetzt zu einem Client umfunktionieren. Nach wochelangem Lesen über Socket (besonders das Thema select^^), ist mir das auch relativ gut gelungen. Es ist kein Problem, große Textdateien oder auch Binärdatein zu senden und zu empfangen. Also der Datenaustausch in Paketen, ist eig. genau so wie du ihn beschrieben hast.

Wie gesagt, jetzt ist es mein Ziel, Dateien "sicher" zu übertragen, ich dachte da zunächst gar nicht an SSL sondern an FTP, da ich dachte das FTP Protokoll wäre allgemein schon sicher. Ich möchte es jetzt aber doch lieber mit TCP und SSL machen.

Da der Server und der Client schon beide relativ große Programme sind, möchte ich nicht alles umschmeißen in eine objektorientierte Sprache, also ich werde egal ob es geht oder nicht in C bleiben müssen.

Die SSL Documentation ist ein wenig irritierend für mich. Ich verstehe noch nicht so ganz, ob ich SSL meine Datenpakete gebe und verschlüsselte Datenpakete zurück bekomme die ich dann über TCP wegschicke und die dann auf dem anderen Rechner per SSL wieder entschlüsselt werden.

Oder ob ich per SSL die Verbindung zu einem anderen Rechner aufbaue, und SSL beim verschicken die Verschlüsselung erledigt.

edit: Das ist das einzige Tutorial, das ich zu SSL und welches C benutzt, gefunden habe.
http://www.ibm.com/developerworks/linux/library/l-openssl.html
Ist das von der Qualität her brauchbar?
 
Zuletzt bearbeitet:
Die SSL Documentation ist ein wenig irritierend für mich. Ich verstehe noch nicht so ganz, ob ich SSL meine Datenpakete gebe und verschlüsselte Datenpakete zurück bekomme die ich dann über TCP wegschicke und die dann auf dem anderen Rechner per SSL wieder entschlüsselt werden.

Oder ob ich per SSL die Verbindung zu einem anderen Rechner aufbaue, und SSL beim verschicken die Verschlüsselung erledigt.

daher die empfehlung sich mal die schichten modelle anzusehen ....

letzteres ist der fall: du behandelst das weiterhin wie eine normale verbindung, der du die zu übertragenden daten übergibst

der aufbau der verbindung mag variieren, je nach verwendeter lib ... ich hab beispiele gesehen bei der du einen socket erstellen musst, den an die ssl lib übergibst, und einen ssl socket zurück bekommst ... im fall von openssl kann eine lib die openssl mitbringt den verbindungsaufbau handeln ... dieser lib sagst du beim initialisieren einfach nur, dass sie den ssl kontext verwenden soll ...

auf der implementationsseite führen viele wege nach rom, aber abstrahiert man das konzept, bemüht man sich meistens die schichten trennung aus OSI oder IP modell anzustreben ... hat halt den vorteil, dass man einzelne schichten (und damit die implementation auf diesen schichten) möglichst einfach austauschen kann

hier in dem fall wäre die schitgrenze an der man "einfach" austauschen kann, der ansatzpunkt zu ssl

ob dein programm nun mit oder ohne verschlüsselung arbeitet, kann dem rest vom programm herzlich egal sein ... die nachrichten die versand werden, werden an irgend einem punkt abgegeben ... diese abgabe funktioniert sehr ähnlich, egal ob danach noch verschlüsselt wird, oder nicht... idealer weise stellst du für c eine funktion bereit, der die daten zum versand übergeben werden, und die kümmert sich um den rest, egal ob da nun schlichtes TCP hintersteht, oder noch der ssl aufsatz dazu kommt ...


wenn es dir um ein beispiel geht, wie man nun genau eine ssl verbindung aufbaut, solltest du uns noch sagen unter welchem OS das ganze laufen soll ... für *nix-artige systeme gibts beispiele wie sand am meer ...
 
Ich möchte es unter Debian machen.
Ist das Tutorial
http://www.ibm.com/developerworks/linux/library/l-openssl.html
dafür passend?

Wenn ich mir das so durchlese, was du schreibst.
Ginge es dann, das ich die momentanen normalen Sockets die ich verwende, "einfach um ändere" in SSL Sockets?
Also das ich lediglich den Verbindungsaufbau der Sockets zu SSL Sockets ändere und die Datenaustauschfunktionen, die ich ja schon habe, dann mit den SSL Sockets arbeiten lasse?
Momentan lassen sich ja Datenpakete bei Sockets aus dem "IP-Stack (liege ich da richtig?)" mit read und send abholen und schicken. Zumindest meine Funktionen arbeiten mit read und send. Ist der Verbindungsaufbau bei SSL dann genauso, dass ich dann genauso Sockets bekomme, die ich mit read, send, und sogar select bearbeiten kann?
 
Zuletzt bearbeitet:
das tutorial zeigt dir, wie das ganze unter verwendung von BIO funktioniert ... ich persönlich bin kein freund von BIO, da mir viele dinge aus der hand genommen werden ...

hier wäre ein tutorial, dass BIO nicht verwendet (sprich du behälst selbst die aufgabe die TCP verbindung zu verwalten)

http://savetheions.com/2010/01/16/quickly-using-openssl-in-c/

ich denke, dass dieser ansatz näher an dem liegt was du bereits hast und dir den einstieg erleichtert, da du weniger ändern musst ...

du baust wie gehabt deine socket verbindung auf ...
du initialisierst die openssl bibliothek....
du stellst den ssl kontext zusammen (zertifikate, etc.)
du gibst den deskriptor deines sockets an openssl (SSL_set_fd)
du startest den ssl handshake (SSL_connect)

danach stehen dir mit SSL_read/SSL_write wie gewohnt 2 methoden bereit, bei denen du deine daten abholen/abliefern kannst ...

den select() teil deines servers kannst du quasi beibehalten, die socket (file) deskriptoren dafür hast du ja ...


was dir aus den 2 tutorials nicht klar wird, verrät dir die docu zu openssl ...

oder frag halt hier ...
 
Vielen Danke für deine bisherige Hilfe, hat mir sehr weitergeholfen. Ich werde mit das Beispiel mal genau anschauen, wenn ich noch Probleme habe, werde ich hier wieder schreiben

Danke
 
Zurück
Oben