In primo luogo, non "crittografare con un certificato". Si crittografa con un protocollo che può utilizzare o meno i certificati per la distribuzione della chiave pubblica. Il protocollo più comunemente usato per proteggere i canali dati bidirezionali è SSL (ora noto come TLS). In SSL, c'è un client e un server , che non devono corrispondere ai "client" e "server" a livello TCP: il "client" SSL è il chi inizia l'handshake SSL, ovvero chi invia il messaggio ClientHello
.
In SSL, il server normalmente mostra la sua chiave pubblica come parte di un certificato. Il client convalida il certificato del server (controlla che venga emesso da una CA attendibile) e verifica che il certificato contenga effettivamente il nome del server previsto. Ciò significa che il cliente ha una certa garanzia che sta parlando con il server giusto. D'altra parte, il server non sa chi è il client; il server ha solo la garanzia che stia parlando con lo stesso client durante l'intera connessione.
Se il server deve sapere con chi sta parlando, è necessario applicare una sorta di autenticazione client. SSL supporta certificati client per questo. Un altro metodo, molto spesso utilizzato in un contesto Web, consiste nell'avere il client mostrare alcune credenziali (un login e una password) all'interno del tunnel SSL (poiché il client ha una certa garanzia di parlare con il giusto server, quindi può inviare la password al server senza timore di intercettazioni da parte di un utente malintenzionato).
SSL supporta anche alcune connessioni senza certificato, ad es. le suite di crittografia PSK , in cui client e server si autenticano reciprocamente rispetto a un valore segreto condiviso; se, nella tua situazione, puoi organizzare che client e server conoscano una chiave segreta comune, questo eviterà tutto il business dei certificati. Se il segreto condiviso è un valore bassa entropia (ad esempio è una "password" che un utente umano sarà in grado di ricordare e accetterà di digitare occasionalmente), quindi suite di crittografia SRP sono la strada da percorrere. Il supporto per PSK o SRP in .NET potrebbe richiedere alcune librerie aggiuntive, tuttavia (ad esempio binding OpenSSL per .NET ).