No. Lo he intentado y el cliente definitivamente no necesita un certificado o una clave predefinida.
Más bien, después de recibir una clave pública (que es parte del certificado) del servidor, el cliente inventa un secreto "sobre la marcha" y lo cifra con la clave pública del certificado del servidor. El cliente envía el secreto cifrado al servidor como parte del protocolo de enlace. Solo el servidor puede descifrar el mensaje que contiene el secreto del cliente siempre y cuando solo el servidor tenga la clave privada correspondiente a la clave pública que envió en el certificado. Tanto el cliente como el servidor utilizan el secreto transmitido de forma segura para continuar la conversación.
Las claves del cliente solo son necesarias cuando el servidor necesita confirmar la identidad del cliente; en ese caso, el cliente y el servidor pueden comunicarse mediante la transmisión de mensajes cifrados con las claves públicas de los demás.
Puede ver esto en acción ejecutando su código con la siguiente opción de jvm:
Djavax.net.debug = ssl, handshake
El cliente y el servidor pueden acordar una serie de sistemas de cifrado diferentes para intercambiar y luego utilizar el secreto inventado; en mi banco de pruebas, el valor predeterminado es el cifrado de curva elíptica, como se describe en
enlace