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á aUserDetailsService
para cargar los permisos del usuario. -
referencia-servicio-usuario
. Este es el identificador del beanUserDetailsService
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.
GO TO FULL VERSION