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