CodeGym /Cursos Java /Módulo 5. Spring /Autenticación X.509

Autenticación X.509

Módulo 5. Spring
Nivel 18 , Lección 8
Disponible

El uso más común de la autenticación de certificado X.509 es autenticar un servidor usando el protocolo SSL, más comúnmente usando HTTPS desde un navegador. El navegador verifica automáticamente que el certificado presentado por el servidor haya sido emitido (es decir, firmado digitalmente) por una de las autoridades certificadoras confiables especificadas en la lista que mantiene.

También puedes utilizar el protocolo SSL con "autenticación mutua"; en cuyo caso el servidor solicitará al cliente un certificado válido como parte del protocolo de enlace SSL. El servidor autentica al cliente verificando que su certificado haya sido firmado por una autoridad certificadora válida. Si se especificó un certificado válido, se puede obtener a través de la API del servlet en la aplicación. El módulo Spring Security para X.509 recupera el certificado mediante un filtro. Asigna un certificado a un usuario de la aplicación y carga el conjunto de credenciales otorgadas de ese usuario para usar con el marco estándar de Spring Security.

Debe familiarizarse con el uso de certificados y configurar la autenticación de cliente para su contenedor de servlets antes de intentar usarlo con Spring Security. La mayor parte del trabajo consiste en crear e instalar los certificados y claves adecuados. Por ejemplo, si está utilizando Tomcat, lea las instrucciones aquí https://tomcat.apache.org/tomcat-9.0-doc/ssl-howto.html. Es importante que todo esto funcione correctamente antes de intentar utilizar Spring Security.

Agregar autenticación basada en X.509 a su aplicación web

Habilitar la autenticación de cliente basada en X.509 es muy sencillo. Sólo necesita agregar el elemento <x509/> a la configuración del espacio de nombres de seguridad http.

<http>
...
<x509 sujeto-principal-regex="CN=(.*?)," user-service-ref="userService"/>;
</http>

El elemento tiene dos atributos opcionales:

  • subject-principal-regex. Regular una expresión regular utilizada para extraer el nombre de usuario del nombre del sujeto del certificado. El valor predeterminado se muestra arriba. Este es el nombre de usuario que se pasará a UserDetailsService para cargar los permisos del usuario.

  • referencia-servicio-usuario. Este es el identificador del bean UserDetailsService que se utilizará con X.509. No es necesario si solo se define uno de estos beans en el contexto de la aplicación.

Subject-principal-regex debe contener un grupo. Por ejemplo, la expresión estándar "CN=(.*?)" coincide con el campo de nombre común. Por lo tanto, si el nombre del sujeto en el certificado es "CN=Jimi Hendrix, OU=...", el nombre de usuario será "Jimi Hendrix". La coincidencia no distingue entre mayúsculas y minúsculas. Por lo tanto, "emailAddress=(.*?)," correspondería a "EMAILADDRESS=jimi@hendrix.org,CN=…" y el nombre de usuario en el resultado será "jimi@hendrix.org". Si el cliente presenta un certificado y se recupera con éxito un nombre de usuario válido, debería aparecer un objeto Authentication válido en el contexto de seguridad. Si no se encontró el certificado, o si no se pudo encontrar el usuario correspondiente, el contexto de seguridad permanecerá vacío. Esto significa que puede utilizar fácilmente la autenticación basada en X.509 con otras opciones, como el inicio de sesión basado en formularios.

Configurando el protocolo SSL en Tomcat

En Repositorios de muestra para Spring Security Hay varios certificados generados previamente. Puede usarlos para habilitar un protocolo SSL con fines de prueba si no desea generar el suyo propio. El archivo server.jks contiene el certificado del servidor, la clave privada y el certificado de la autoridad certificadora. También hay varios archivos de certificados de cliente para los usuarios de las aplicaciones de muestra. Puedes instalarlos en tu navegador para autenticar al cliente mediante el protocolo SSL

Para ejecutar Tomcat con soporte SSL, coloque el archivo server.jks en el directorio de Tomcat llamado conf y agregue el siguiente conector al archivo server.xml

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" scheme="https" secure="true"
                                                                clientAuth="true" sslProtocol="TLS"
                                                                keystoreFile="${catalina.home}/conf/server.jks"
                                                                keystoreType="JKS" keystorePass="password"
                                                                truststoreFile="${catalina.home}/conf/server.jks"
                                                                truststoreType="JKS" truststorePass="password"/>

clientAuth también se puede configurar en want si desea que el protocolo SSL se instale correctamente incluso si el cliente no presenta un certificado. Los clientes que no presenten un certificado no podrán acceder a los objetos protegidos por Spring Security a menos que utilice un mecanismo de autenticación distinto de X.509, como la autenticación de formulario.

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION