Implementar tanto mTLS (SSL bidireccional) como puntos finales públicos (sin verificación SSL).
Tengo una aplicación Spring Boot que tiene algunos puntos finales:
/.wellknown
que no requiere autenticación y está abierto al público/callback
que requiere mTLS (solo autenticación de certificado).
Para el requisito anterior, no puedo encontrar una implementación exacta. La mayoría de las implementaciones:
1) habilitan mTLS a nivel de servidor, lo que significa que todos los API tienen mTLS habilitado.
2) con verificación de certificado X.509 que verifica el certificado y los datos del usuario (en mi caso, no hay datos de usuario involucrados, solo mTLS de servidor a servidor).
Encontré el siguiente código:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
/*
* Habilita la autenticación del cliente x509.
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
// @formatter:off
http
.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.x509()
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.NEVER)
.and()
.csrf()
.disable();
// @formatter:on
}
/*
* Crea un administrador de autenticación en memoria. Creamos 1 usuario (localhost que
* es el CN del certificado del cliente) que tiene un rol de USUARIO.
*/
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("localhost").password("none").roles("USER");
}
}
Ayuda por favor sobre cómo implementar lo mismo.
1) /callback
– verificar si el cliente proporciona el certificado y está disponible en el almacén de confianza.
2) /.well-known/
No hay verificación de mTLS, responder sin ninguna comprobación.
davy.ai
Para implementar los requisitos anteriores, se puede utilizar Spring Security para configurar diferentes requisitos de autenticación para cada punto final.
/callback
, se puede habilitar mTLS (solo autenticación de certificado) utilizandoX509Configurer
y el métodowithUserPrincipalName()
para verificar si el certificado del cliente está disponible en el almacén de confianza./.well-known/
, se puede responder sin realizar ninguna verificación de autenticación mediante la adición de una excepción para este punto final en el métodoconfigure(WebSecurity web)
.Con estas configuraciones, las solicitudes al punto final
/callback
requerirán mTLS (solo autenticación de certificado) y las solicitudes al punto final/.well-known/
se responderán sin realizar ninguna verificación de autenticación.