VPN significa "Rete privata virtuale". È un concetto generico che designa una parte di una rete più grande (ad esempio Internet in generale) che è logicamente isolata dalla rete più grande attraverso mezzi non hardware (questo è ciò che significa "virtuale"): non è che stiamo usando distinti cavi e interruttori; piuttosto, l'isolamento viene eseguito tramite l'uso della crittografia.
SSL (ora noto come TLS) è una tecnologia che accetta un mezzo di trasporto bidirezionale e fornisce un mezzo bidirezionale protetto . Richiede che il mezzo di trasporto sottostante sia "per lo più affidabile" (quando non viene attaccato, i byte di dati vengono trasferiti nel dovuto ordine, senza perdite e senza ripetizioni). SSL fornisce riservatezza, integrità (le alterazioni attive vengono rilevate in modo affidabile) e alcune autenticazioni (solitamente autenticazione del server, possibilmente autenticazione reciproca client-server se si utilizzano certificati su entrambi i lati).
Quindi VPN e SSL non provengono dal stesso livello. Una implementazione VPN richiede un po 'di crittografia a un certo punto. Alcune implementazioni VPN utilizzano effettivamente SSL, risultando in un sistema a più livelli: la VPN trasferisce i pacchetti IP (della rete virtuale) serializzandoli su una connessione SSL, che a sua volta utilizza il TCP come mezzo di trasporto, che è costruito sui pacchetti IP (sul rete fisica non protetta). IPsec è un'altra tecnologia che è più profondamente integrata nei pacchetti, che sopprime alcuni di questi livelli ed è quindi un po 'più efficiente (meno overhead della larghezza di banda). D'altra parte, IPsec deve essere gestito abbastanza in profondità all'interno del codice di rete del sistema operativo, mentre una VPN basata su SSL ha solo bisogno di un modo per dirottare il traffico in entrata e in uscita; il resto può essere disattivato nel software a livello utente.
Da quanto ho capito la tua domanda, hai un'applicazione in cui alcune macchine devono comunicare su Internet. Hai alcuni requisiti di sicurezza e stai pensando di utilizzare SSL (su TCP su IP) o possibilmente HTTPS (che è HTTP-su-SSL-su-TCP-su-IP) o di configurare una VPN tra client e server e utilizzando il "semplice" TCP in quella rete privata (il punto della VPN è che ti offre una rete sicura in cui non devi più preoccuparti della riservatezza). Con SSL, il tuo codice di connessione deve essere a conoscenza della sicurezza; dal punto di vista della programmazione non si apre una connessione SSL come se fosse "solo un socket". Alcune librerie lo rendono relativamente semplice, ma è comunque necessario gestire la sicurezza a livello di applicazione. Una VPN, d'altra parte, è configurata a livello di sistema operativo, quindi la sicurezza non è tra la tua applicazione sul client e la tua applicazione sul server, ma tra il sistema operativo del client e il sistema operativo del server: non è la stessa sicurezza anche se in molte situazioni la differenza risulta non essere rilevante.
In pratica, una VPN significa che sono necessari alcuni passaggi di configurazione sul sistema operativo client. È abbastanza invasivo. L'utilizzo di due applicazioni basate su VPN sullo stesso client può essere problematico (dal punto di vista della sicurezza, perché il client funge quindi da bridge che collega tra loro due VPN che dovrebbero essere nominalmente isolate l'una dall'altra, e anche in pratica, a causa delle collisioni nell'indirizzo spazio). Se il cliente è un cliente, fargli configurare correttamente una VPN sembra un'attività impossibile. Tuttavia , una VPN significa che le applicazioni non devono essere consapevoli della sicurezza, quindi questo rende molto più facile integrare software di terze parti all'interno della tua applicazione.