Newbie SSL: il client https richiede anche un certificato?

6

Sto chiamando un https tramite un programma Java. Il mio client Java deve fornire un certificato al server per stabilire questa connessione? In altre parole, ho bisogno del mio certificato o del certificato del server (che contiene la sua chiave pubblica)?

    
posta AbuMariam 14.01.2016 - 17:18
fonte

3 risposte

9

Dipende da cosa stai facendo e cosa vuoi verificare. Se stai accedendo ai dati e vuoi essere sicuro che il server che conosce la chiave privata corrispondente sia quello che ti invia i dati (ad esempio stai accedendo a una pagina Web), non hai bisogno del tuo certificato.

Se il server vuole essere in grado di verificare che il client sia predefinito, che conosce una chiave privata corrispondente a una chiave pubblica riconosciuta come sorgente valida, il client avrà bisogno di un certificato. Questo tende ad essere usato quando una coppia di server sta comunicando - ognuno firma i dati con la propria chiave privata e può verificare che i dati provengano da un'origine conosciuta controllando le chiavi pubbliche. Può anche essere utilizzato con alcune API, a cui sono destinati solo i client specifici.

A un certo punto, quindi, non hai bisogno del tuo certificato per il tuo cliente - in genere è abbastanza ben documentato dal server, se lo fai.

    
risposta data 14.01.2016 - 17:24
fonte
4

In generale, la maggior parte dei server Web che eseguono HTTPS non richiedono che il client abbia un certificato. Se il server richiede che il client esegua l'autenticazione, questo viene spesso eseguito tramite credenziali (ad es. Nome utente e password).

Tuttavia, il contrario non è generalmente vero - ad esempio, la maggior parte dei client richiede che i server Web abbiano un certificato valido firmato da una CA riconosciuta. È responsabilità del cliente verificare che il certificato sia valido, altrimenti il cliente non ha modo di essere sicuro che sia effettivamente collegato al server a cui è destinato a connettersi e che non sia MITM. / p>     

risposta data 14.01.2016 - 17:26
fonte
1

No. L'ho provato e il client sicuramente non ha bisogno di un certificato o di una chiave predefinita.

Piuttosto, dopo aver ricevuto una chiave pubblica (che fa parte del certificato) dal server, il client crea un segreto "al volo" e lo crittografa con la chiave pubblica dal certificato del server. Il client invia il segreto crittografato al server come parte dell'handshake. Solo il server può decrittografare il messaggio contenente il segreto dal client fintantoché solo il server ha la chiave privata corrispondente alla chiave pubblica che ha inviato nel certificato. Sia il client che il server utilizzano quindi il segreto trasmesso in modo sicuro per continuare la conversazione.

Le chiavi client sono necessarie solo quando il server deve confermare l'identità del client; in tal caso, il client e il server possono comunicare trasmettendo invece messaggi crittografati con le rispettive chiavi pubbliche.

Puoi vederlo in azione eseguendo il tuo codice con la seguente opzione jvm:

Djavax.net.debug = ssl, stretta di mano

Il client e il server possono concordare un numero di diversi sistemi di cifratura mediante i quali scambiare e quindi utilizzare il segreto inventato; sul mio banco di prova è stato impostato di default sulla crittografia Elliptic Curve, come descritto in

link

    
risposta data 07.09.2018 - 16:02
fonte

Leggi altre domande sui tag