Curl für TLS-Authentifizierung, danach direkte Socketprogrammierung
-
Hallo,
ich kenne mich etwas mit Curl (Mails versenden, HTTP) aus, aber eben nicht gut genug.
Ich muss eine Socketverbindung zu einem Server herstellen und mich mit meinem Clientzertifikat ausweisen. Ist die Verbindung hergestellt, möchte ich über die SSL/TLS-Verbindung per socket kommmunizieren.
Oder anders ausgedrückt: curl soll die SSL/TLS Aushandlung machen, danach möchte ich den curl-Socket benutzen.
Experimentiert hab ich schon, der connect klappt auch, aber die TLS Aushandlung findet nicht statt.
In openssl-Programmierung möchte ich mich möglichst nicht einarbeiten.
Geht das, was ich mir vorstelle überhaupt mit Curl?
Grüße!
-
...schau ob das weiter hilft:
http://www.codeproject.com/Articles/326574/An-Introduction-to-Mutual-SSL-Authentication
http://www.codeguru.com/cpp/com-tech/complus/soap/article.php/c3945/SOAP-Client-Using-Visual-C.htm
-
Die Windows-Version von curl nutzt normalerweise schannel.
schannel ("Secure Channel") enthält Microsofts SSL/TLS-Implementierung, die z.B. auch das .NET-Framework in der SslStream-Klasse nutzt.Du könntest dir quasi den curl-Quellcode anschauen und schauen, wie das bei curl abläuft:
https://github.com/bagder/curl/blob/master/lib/vtls/schannel.c
...und schauen, ob man da ggf. erkennen kann, ob man das evtl. auch direkt ohne HTTP/FTP nutzen könnte.Der Ablauf mit der schannel/sspi API wäre ansonsten grob wie folgt:
- Socket erstellen
- AcquireCredentialsHandle()
- Mehrere InitializeSecurityContext()-Aufrufe (SSL/TLS-Aushandlung) + recv()/send() je nach Rückgabewerten
- Anschließend Daten mit recv() aus der Socketverbindung lesen und mit DecryptMessage() entschlüsseln. Analog mit EncryptMessage() und send() Daten verschlüssel und senden
- Cleanup (Handles schließen, Verbindung schließen ,...)
...ist nicht ganz trivial und es gibt mehrere zu beachtende Sonderfälle.
Ich würde da wirklich lieber nach einer brauchbaren Lib suchen, statt die schannel-Variante selbst direkt zu verwenden.
-
Danke für die Beispiele!!
Ich habe mich mittlerweile mal mit OpenSSL beschäftigt. Das SChannel-Beispiel ist um einiges komplizierter, als OpenSSL direkt zu verwenden.
Also: ich setze mal auf OpenSSL.
Vielen Dank nochmals!!
-
Empfehlung: LibreSSL ( http://www.libressl.org/ , https://de.wikipedia.org/wiki/LibreSSL).
OpenSSL ist durch verschiedene massive Sicherheitslücken - u.a. Heartbleed - etwas in Verruf gekommen. LibreSSL ist von OpenSSL abgezweigt und großflächig bereinigt.
-
Hallo & Danke für die Antworten.
War im Urlaub, deshalb erst spät meine Antwort.
Ich hab mir mittlerweile mal Beispielprogramme von OpenSSL angesehen und werde wohl die Beispiele für meine Zwecke anpassen
Grüße!