SSL Newbie: ¿El cliente https también necesita un certificado?

6

Estoy llamando a una URL https a través de un programa Java. ¿Mi cliente Java necesita proporcionar un certificado al servidor para establecer esta conexión? En otras palabras, ¿necesito mi propio certificado o es suficiente el certificado del servidor (que contiene su clave pública)?

    
pregunta AbuMariam 14.01.2016 - 17:18
fuente

3 respuestas

8

Depende de lo que estés haciendo y de lo que quieras verificar. Si está accediendo a datos y quiere asegurarse de que el servidor que conoce la clave privada correspondiente es el que le envía los datos (por ejemplo, está accediendo a una página web), no necesita su propio certificado.

Si el servidor desea poder verificar que el cliente es uno predefinido, que conoce una clave privada correspondiente a una clave pública reconocida como una fuente válida, su cliente necesitará un certificado. Esto suele usarse cuando un par de servidores se están comunicando: cada uno de ellos firma los datos con su propia clave privada y puede verificar que los datos provienen de una fuente conocida mediante la verificación de las claves públicas. También se puede utilizar con algunas API, a las que solo deben acceder clientes específicos.

En una suposición, por lo tanto, no necesita su propio certificado para su cliente; en general, el servidor lo documenta bastante bien si lo necesita.

    
respondido por el Matthew 14.01.2016 - 17:24
fuente
4

En general, la mayoría de los servidores web que ejecutan HTTPS no requieren que el cliente tenga un certificado. Si el servidor requiere que el cliente se autentique, esto se hace a menudo a través de credenciales (por ejemplo, nombre de usuario y contraseña).

Sin embargo, lo contrario generalmente no es cierto, es decir, la mayoría de los clientes SÍ requieren que los servidores web tengan un certificado válido firmado por una CA reconocida. Es responsabilidad del cliente verificar que el certificado sea válido; de lo contrario, el cliente no tiene ninguna manera de asegurarse de que, de hecho, esté conectado al servidor al que pretende conectarse y de que no esté siendo MITM'd.

    
respondido por el mti2935 14.01.2016 - 17:26
fuente
1

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

    
respondido por el Matt 07.09.2018 - 16:02
fuente

Lea otras preguntas en las etiquetas