2009-07-09 20 views
12

Ecco la mia domanda.Aggiunta del supporto SSL al codice TCP & UDP esistente?

In questo momento ho una domanda di server Linux (scritto in C++ - gcc) (. Visual Studio 9, Qt 4.5) che comunica con un Windows C++ applicazione client

Qual è la molto modo più semplice per aggiungere Supporto SSL per entrambe le parti al fine di proteggere la comunicazione, senza completamente sventrare il protocollo esistente?

È un'applicazione VOIP che utilizza una combinazione di UDP e TCP per impostare inizialmente la connessione ed eseguire operazioni di tunneling delle porte e quindi utilizza UDP per i dati di streaming.

Ho avuto molti problemi in passato con la creazione da zero dei certificati di sicurezza necessari per far funzionare questa roba.

Il codice dell'esempio di lavoro esistente sarebbe l'ideale.

Grazie!

risposta

11

SSL is very complex, quindi hai intenzione di voler utilizzare una libreria.

Ci sono diverse opzioni, come ad esempio Keyczar, Botan, cryptlib, ecc Ognuno di queste librerie (o le librerie suggeriti da altri, come ad esempio Boost.Asio o OpenSSL) avranno codice di esempio per questo.


rispondere alla tua seconda domanda (come integrare una libreria in codice esistente senza causare troppo dolore): sta andando a dipendere dal vostro codice corrente. Se hai già delle semplici funzioni che chiamano i metodi Winsock o socket per inviare/ricevere int s, strings, ecc., Devi solo riscrivere le viscere di tali funzioni. E, naturalmente, cambia il codice che imposta il socket per iniziare.

D'altra parte, se si stanno chiamando direttamente le funzioni Winsock/socket, probabilmente si vorrà scrivere funzioni con semantica simile ma inviare i dati crittografati e sostituire le chiamate Winsock con tali funzioni.

Tuttavia, si consiglia di prendere in considerazione il passaggio a qualcosa come Google Protocol Buffers o Apache Thrift (a.k. Facebook Thrift). la documentazione buffer protocollo di Google dice: "Prima di buffer di protocollo, c'era un formato per le richieste e le risposte che hanno usato la mano di smistamento/unmarshalling di richieste e risposte, e che hanno sostenuto un certo numero di versioni del protocollo. Ciò ha provocato un po 'di codice molto brutto. ..."

attualmente sei in fase di mano marshalling/unmarshalling. Può funzionare, e in effetti un progetto su cui lavoro utilizza questo metodo. Ma è molto più bello lasciarlo in una biblioteca; in particolare una biblioteca che ha già pensato di aggiornare il software in futuro.

Se vuoi seguire questa strada si impostano le connessioni di rete con una libreria SSL, e poi ti spinge i dati Protocollo Buffer Thrift/su quelle connessioni. Questo è tutto. Ciò implica un ampio refactoring, ma ti ritroverai con meno codice da mantenere. Quando abbiamo introdotto i buffer di protocollo nella base di codice di quel progetto che ho menzionato, siamo stati in grado di sbarazzarci di circa 300 righe di codice di marshalling/demarshalling.

+0

Ciao, Max, Grazie per i dettagli aggiunti. (Forse la mia domanda iniziale non era formulata in modo chiaro). La tua risposta aggiunge l'intuizione che fa clic per me. Ho uno abbastanza brutto processo di presa, codificati a mano con sede nel codice che fa una sorta di "stretta di mano" con il server, e in particolare imposta il tunneling porta UDP. Il resto del codice di rete è estratto in "SendXMLViaTCPAndWaitForResponse()" per le funzioni di aiuto. Basta mordere il proiettile non dovrebbe essere così difficile, dovrebbe comportare una piccola ricodifica al di là dei soccorsi. Grazie ancora per averlo scoperto. –

4

Si consiglia di utilizzare GnuTLS sul lato client e lato server, solo per la connessione TCP. Dimentica i dati UDP per ora. La documentazione di GnuTLS ha example code per scrivere sia client che server. Si prega di comprendere che almeno il lato server (tipicamente il risponditore TCP) deve avere un certificato; il lato client può lavorare con l'identificazione anonima (anche se c'è anche un esempio senza certificato del server, usando solo lo scambio di chiavi DH - che consentirebbe attacchi man-in-the-middle).

In generale, è probabile che dovrete comprendere i principi di SSL, indipendentemente dalla libreria utilizzata. Le alternative di libreria sono OpenSSL (sia Unix che Windows) e SChannel (solo Windows).

2

Hai provato il supporto SSL in Boost.Asio o ACE? Entrambi usano OpenSSL sotto il cofano e forniscono astrazioni simili per TCP, UDP e SSL. Il codice di esempio è disponibile in entrambe le distribuzioni Boost.Asio e ACE.

Una cosa che potrebbe essere necessario tenere a mente è che SSL è orientato al record invece che al flusso (sia TCP che UDP). Ciò potrebbe influire sulla modalità di multiplex degli eventi poiché è necessario, ad esempio, leggere il record SSL completo prima di poter richiamare un'operazione di lettura completata.

2

Per aiutare gestire questo senza modifiche all'applicazione yo consiglia di guardare al progetto Stunnel (http://www.stunnel.org/). Non penso che gestirà l'UDP per te.

2

Il yaSSL e CyaSSL SSL embedded/TLS biblioteche hanno funzionato bene per me in passato. Essendo mirati ai sistemi embedded, sono ottimizzati per velocità e dimensioni. yaSSL è scritto in C++ e CyaSSL è scritto in C. In confronto, CyaSSL può essere fino a 20 volte più piccolo di OpenSSL.

Entrambi supportano i più recenti standard del settore (fino a TLS 1.2), offrono alcune funzioni interessanti come i codici di flusso e sono con licenza doppia sotto GPLv2 e una licenza commerciale (se è necessario il supporto commerciale).

Hanno un tutorial SSL che tocca l'aggiunta CyaSSL nel codice preesistente così: http://www.yassl.com/yaSSL/Docs-cyassl-manual-11-ssl-tutorial.html

prodotto Pagina: http://yassl.com/yaSSL/Products.html

saluti,
Chris

+0

Ciao Chris, grazie per la risposta. Sfortunatamente, più di un anno è passato dal mio post, e il cliente ha annullato il progetto e mi ha buttato fuori dal progetto un paio di settimane fa. –

+0

Triste per sentire. Mi sono reso conto che era passato molto tempo dal tuo post, ma pensavo di pubblicare almeno per l'amor di riferimento futuro. – Chrisc

Problemi correlati