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 (è 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 dei dati vengono trasferiti nell'ordine dovuto, senza perdite e senza ripetizioni). SSL offre riservatezza, integrità (le alterazioni attive sono rilevate in modo affidabile) e alcune autenticazioni (di solito l'autenticazione del server, possibilmente l'autenticazione reciproca client-server se si usano certificati su entrambi i lati).
Quindi VPN e SSL non sono dello stesso livello. Un'implementazione di 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 pacchetti IP (della rete virtuale) serializzandoli su una connessione SSL, che a sua volta utilizza TCP come mezzo di trasporto, che è costruito su 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.
Come 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-over-SSL-over-TCP-over-IP) o impostare una VPN tra client e server e usando il TCP "normale" in quella rete privata (il punto della VPN è che ti dà una rete sicura dove non devi più preoccuparti della riservatezza). Con SSL, il codice di connessione deve essere consapevole 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 ancora, è necessario gestire la sicurezza a livello di applicazione. Una VPN, d'altra parte, è configurata a livello di sistema operativo, quindi la sicurezza non è tra l'applicazione sul client e l'applicazione sul server, ma tra il sistema operativo client e il sistema operativo del server: non è la stessa sicurezza modello, anche se in molte situazioni la differenza risulta non pertinente.
In pratica, una VPN significa che è necessario un passo di configurazione sul sistema operativo del client. È abbastanza invasivo. L'utilizzo di due applicazioni basate su VPN sullo stesso client può essere problematico (per quanto riguarda la sicurezza, poiché il client funge da ponte che collega tra loro due VPN che dovrebbero essere nominalmente isolate l'una dall'altra, e in pratica anche a causa di collisioni nell'indirizzo spazio). Se il cliente è un cliente, averlo configurato correttamente sembra un compito impossibile. Tuttavia , una VPN significa che le applicazioni non devono essere a conoscenza della sicurezza, quindi questo rende molto più facile integrare il software di terze parti all'interno della tua applicazione.