Esta es mi comprensión de SSL, no soy un experto en el tema, pero a falta de otras respuestas espero poder al menos darle algunas cosas en qué pensar.
Cuando crea un certificado autofirmado para el servidor, necesita agregarlo al cliente de alguna manera, no se instala tan pronto como el cliente se conecta; de lo contrario, cualquier servidor podría convertirse en confiable mediante el envío de un certificado autofirmado a todo lo que intente conectarse a él. En mi aplicación, el certificado del servidor se carga en el almacén de confianza del cliente cuando se inicia especificando javax.net.ssl.truststore ("ruta/a/servidor/cert");
Ahora, cuando el cliente se conecta al servidor, se produce el apretón de manos. En este punto, el servidor enviará su certificado al cliente y el cliente confirmará que, de hecho, proviene del servidor, al marcarlo en su almacén de confianza (en este punto no importa si es autofirmado o no, porque el cliente debe verificar los certificados raíz, así como los que haya agregado). Si el certificado enviado por el servidor verifica, la comunicación continúa y los datos se comparten.
Hay alguna forma de behvaiour de sesión que tiene lugar que permite que la comunicación continúe sin tener que intercambiar certificados cada vez. Pero creo que esto se limita a la conexión única, por lo que tan pronto como cierre la conexión y cree una nueva, el proceso debe repetirse, es decir, el servidor debe enviar su certificado para su validación nuevamente.
Por lo tanto, en resumen: el certificado de servidor autofirmado debe instalarse en el cliente fuera de la comunicación SSL (por ejemplo, cómo se instalan los certificados raíz de CA en un producto desde el principio). Cada conexión SSL hecha entre el cliente y el servidor requerirá que el servidor envíe su certificado al cliente para que pueda verificarlo contra su almacén de confianza.
Es posible que el servidor permita reanudar las sesiones, en cuyo caso no se volverá a enviar el certificado (pero no estoy seguro de en qué condiciones se puede reanudar una sesión, tal vez sea configurable en diferentes servidores) .
Espero que esto al menos te dé algo en qué pensar.
Escribí un simulador de https en java. Pude simular 12000 - 15000 solicitudes en 15 segundos utilizando certificados autofirmados. ¿Pero lleva 3 minutos usar certificados de CA? Realmente no entiendo por qué sucede esto. ¿Hay alguna diferencia sutil en el manejo de los certificados autofirmados contra CA? – JKV