2009-07-09 14 views
12

Hier ist meine Frage.SSL-Unterstützung für vorhandenen TCP- und UDP-Code hinzufügen?

Im Moment habe ich eine Anwendung Linux-Servers (geschrieben in C++ - gcc) (. Visual Studio 9, Qt 4.5), die mit einem Windows-C++ Client-Anwendung

Was ist der sehr einfachste Weg, um hinzuzufügen kommunizieren SSL-Unterstützung für beide Seiten, um die Kommunikation zu sichern, ohne das bestehende Protokoll vollständig zu entkernen?

Es ist eine VoIP-Anwendung, die eine Kombination aus UDP und TCP verwendet, um die Verbindung zu initialisieren und Port-Tunneling-Kram zu machen, und dann UDP für das Streaming von Daten verwendet.

Ich hatte in der Vergangenheit viele Probleme mit der Schaffung der Sicherheitszertifikate von Grund auf, die notwendig waren, um dieses Zeug zum Laufen zu bringen.

Vorhandener funktionierender Beispielcode wäre ideal.

Vielen Dank!

Antwort

11

SSL is very complex, also werden Sie eine Bibliothek verwenden wollen.

Es gibt mehrere Möglichkeiten, wie Keyczar, Botan, cryptlib usw. Jede und jeder dieser Bibliotheken (oder die von anderen, wie Boost.Asio oder OpenSSL vorgeschlagen Bibliotheken) werden für diese Beispielcode haben.


Beantwortung Ihrer zweiten Frage (wie eine Bibliothek in bestehende Code zu integrieren, ohne zu viel Schmerz verursacht): es wird auf Ihrem aktuellen Code abhängen. Wenn Sie bereits einfache Funktionen haben, die die Winsock- oder Socket-Methoden zum Senden/Empfangen von int s, strings usw. aufrufen, müssen Sie nur die Eingeweide dieser Funktionen neu schreiben. Und ändern Sie natürlich den Code, der den Socket einrichtet.

Auf der anderen Seite, wenn Sie die Winsock/Socket-Funktionen direkt aufrufen, dann möchten Sie wahrscheinlich Funktionen mit ähnlicher Semantik schreiben, aber die Daten verschlüsselt senden und Ihre Winsock-Aufrufe mit diesen Funktionen ersetzen.

Sie können jedoch in Betracht ziehen, zu etwas wie Google Protocol Buffers oder Apache Thrift (a.k.a. Facebook Thrift) zu wechseln. Googles Protokollpuffer-Dokumentation sagt: "Vor den Protokollpuffern gab es ein Format für Anforderungen und Antworten, die das Hand-Marshalling/Unmarshalling von Anforderungen und Antworten verwendeten und das eine Reihe von Versionen des Protokolls unterstützte. Dies führte zu sehr hässlichem Code. ... "

Sie befinden sich gerade in der Hand-Marshalling-/Unmarshalling-Phase. Es kann funktionieren, und tatsächlich verwendet ein Projekt, an dem ich arbeite, diese Methode. Aber es ist viel schöner, das einer Bibliothek zu überlassen; vor allem eine Bibliothek, die sich bereits Gedanken gemacht hat, die Software in Zukunft zu aktualisieren.

Wenn Sie diese Route gehen, richten Sie Ihre Netzwerkverbindungen mit einer SSL-Bibliothek ein, und dann werden Sie Ihre Thrift/Protocol Buffer-Daten über diese Verbindungen übertragen. Das ist es. Es beinhaltet umfangreiche Refactoring, aber Sie werden am Ende mit weniger Code zu pflegen. Als wir Protocol Buffers in die Codebasis des von mir erwähnten Projekts einführten, konnten wir ungefähr 300 Zeilen mit Marshalling/Demarshalling-Code entfernen.

+0

Hallo, Max, Danke für die zusätzlichen Details. (Vielleicht wurde meine ursprüngliche Frage nicht klar formuliert.) Ihre Antwort fügt die Einsicht hinzu, die für mich klickt. Ich habe einen ziemlich hässlichen, handcodierten Socket-basierten Prozess im Code, der eine Art "Handshake" mit dem Server durchführt und speziell das UDP-Port-Tunneling einrichtet. Der Rest des Netzwerkcodes wird in Hilfsfunktionen vom Typ "SendXMLViaTCPAndWaitForResponse()" abstrahiert. Nur die Kugel zu beißen sollte nicht so schwer sein, es sollte wenig Rekodierung über die Hilfsfunktionen hinausgehen. Nochmals vielen Dank dafür, dass Sie dies festgestellt haben. –

4

Ich empfehle, GnuTLS auf der Client- und der Serverseite zu verwenden, nur für die TCP-Verbindung. Vergessen Sie die UDP-Daten für jetzt. Die GnuTLS-Dokumentation enthält example code zum Schreiben von Clients und Servern. Bitte haben Sie Verständnis dafür, dass zumindest die Serverseite (typischerweise der TCP-Responder) ein Zertifikat haben muss; Die Client-Seite kann mit anonymer Identifikation arbeiten (obwohl es sogar ein Beispiel ohne Server-Zertifikat gibt, das nur DH-Schlüsselaustausch verwendet - was Man-in-the-Middle-Angriffe erlauben würde).

Im Allgemeinen ist es wahrscheinlich, dass Sie die Prinzipien von SSL verstehen müssen, egal welche Bibliothek Sie verwenden. Bibliotheksalternativen sind OpenSSL (beide Unix und Windows) und SChannel (nur Windows).

2

Haben Sie die SSL-Unterstützung in Boost.Asio oder ACE versucht? Beide verwenden OpenSSL unter der Haube und bieten ähnliche Abstraktionen für TCP, UDP und SSL. Beispielcode ist in den Distributionen Boost.Asio und ACE verfügbar.

Eine Sache, die Sie beachten sollten, ist, dass SSL Datensatz-orientierte statt Stream-orientierte (TCP und UDP) ist. Dies kann sich auf das Multiplexen von Ereignissen auswirken, da Sie beispielsweise den vollständigen SSL-Datensatz lesen müssen, bevor Sie eine Leseoperation abschließen können.

2

Um dies ohne Änderungen an der Anwendung zu handhaben, können Sie sich das Stunnel-Projekt anschauen (http://www.stunnel.org/). Ich denke nicht, dass es das UDP für Sie behandeln wird.

2

Die eingebetteten yaSSL und CyaSSL SSL/TLS Bibliotheken haben in der Vergangenheit gut funktioniert. Sie sind auf Embedded-Systeme ausgerichtet und auf Geschwindigkeit und Größe optimiert. yaSSL ist in C++ geschrieben und CyaSSL ist in C geschrieben. Im Vergleich dazu kann CyaSSL bis zu 20 mal kleiner sein als OpenSSL.

Beide unterstützen die aktuellsten Industriestandards (bis zu TLS 1.2), bieten einige coole Funktionen wie Stream-Verschlüsselungen und sind unter der GPLv2 und einer kommerziellen Lizenz dual lizenziert (wenn Sie kommerzielle Unterstützung benötigen).

Sie haben ein SSL-Tutorial, das CyaSSL in Ihre bereits bestehenden Code berührt auch über das Hinzufügen von: http://www.yassl.com/yaSSL/Docs-cyassl-manual-11-ssl-tutorial.html

Produktseite: http://yassl.com/yaSSL/Products.html

Grüße,
Chris

+0

Hallo Chris, danke für die Antwort. Leider ist seit meiner Veröffentlichung ein Jahr vergangen und der Kunde hat das Projekt abgebrochen und mich vor ein paar Wochen von dem Projekt verabschiedet. –

+0

Traurig zu hören. Ich habe gemerkt, dass es lange her ist, seit du gepostet hast, aber ich dachte, ich würde zumindest für den zukünftigen Zweck posten. – Chrisc

Verwandte Themen