java - ubicacion - su configuracion de seguridad ha bloqueado la ejecución de una aplicacion formada con un certificado
Autenticación Spring security x.509: acepte certificados basados en la autoridad de certificación del emisor (1)
Estoy usando Spring Security para autenticar usando un certificado x.509 , y solo funciona cuando el certificado del cliente que está configurado en el almacén de claves del navegador está presente en el servidor trust-store.
Cómo está funcionando actualmente:
- Configuré la autenticación del cliente SSL como opcional ( server.ssl.client-auth = want , como en esta publicación )
- He configurado un servidor trust-store que contiene todos los certificados de cliente. Si el certificado presentado por el cliente está en el almacén de confianza, se crea la conexión mutua de SSL.
- Cuando tengo los certificados de cliente presentes en el almacén de confianza del lado del servidor, Firefox abre una ventana emergente con mi (s) certificado (s) del lado del cliente, que puedo elegir y se establece la conexión mutua de SSL.
- Configuré Spring Security para extraer el nombre de usuario del SubjectDN del certificado del cliente y verificarlo con un UserDetailsService . Si se devuelve un objeto UserDetails para ese nombre de usuario, el proceso de autenticación se completa con éxito
El problema es que si elimino el certificado de cliente del trust-store del lado del servidor, Firefox ya no abre esta ventana emergente y solo se establece una conexión SSL de una vía. Incluso si el certificado Root CA está presente en el almacén de confianza del servidor.
Lo que quiero:
- almacenar en el servidor trust-store solo el certificado de una Root Certificate Authority
- permitir la conexión mutua de SSL cuando el cliente presente un certificado emitido por la CA raíz en la tienda de confianza del servidor (incluso si el certificado del cliente no está presente en la tienda de confianza del servidor)
También me intrigan dos recursos en internet. En este tutorial sobre Baeldung, dice que todos los certificados del cliente deben almacenarse en el servidor trust-store para que funcione la autenticación X.509 (lo que confirma mi experiencia).
Debe recordar que para cada usuario que el servidor debe verificar, su propio certificado debe instalarse en el almacén de confianza configurado. Para aplicaciones pequeñas con solo unos pocos clientes, esto puede ser factible, con un número creciente de clientes puede llevar a una gestión de claves compleja para los usuarios.
Sin embargo, este tutorial de @ robinhowlett dice que
El cliente presentará su certificado en su almacén de claves al servidor, y el servidor validará la cadena del certificado del cliente utilizando el certificado de CA en el almacén de confianza del servidor.
Esto es básicamente lo que quiero lograr, pero no puedo.
En pocas palabras: ¿logró alguien almacenar uno o más certificados de CA raíz en la tienda de confianza del servidor y usar certificados de clientes emitidos por estas CA raíz para autenticarse mediante el protocolo de enlace mutuo SSL X.509 en Spring Security?
Estoy usando Spring Boot 1.5.2.RELEASE (Spring-security-web 4.2.2.RELEASE). He probado mi autenticación SSL de trabajo con Firefox 53.
Encontré mi problema: estaba modificando el trust-store (eliminando el certificado del cliente y dejando solo el certificado CA) mientras el servidor estaba funcionando (Tomcat, en mi caso). Pero el trust-store se guarda en la memoria y se lee solo una vez, cuando se inicializa la JVM (detalles en esta publicación de ServerFault ). Por lo tanto, Tomcat no lee los cambios en el trust-store durante el tiempo de ejecución.
Entonces, la respuesta es simple: sí, si solo hay certificaciones de CA presentes en el almacén de confianza, durante el protocolo SSL, el servidor se comunica con el navegador, quiere certificados de cliente emitidos por las CA confiables y luego el navegador solicita al usuario que seleccione un certificado que es emitido por una CA confiable (si tal certificado está presente en el almacén de claves del navegador).
Sin embargo, si una CA se agrega dinámicamente al servidor trust-store mientras el servidor está funcionando, no se detectará. La nueva CA solo se reconocerá después de que el servidor se reinicie (y la JVM se reinicialice).