es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para implementar los requisitos anteriores, se puede utilizar Spring Security para configurar diferentes requisitos de autenticación para cada punto final.

    1. Para el punto final /callback, se puede habilitar mTLS (solo autenticación de certificado) utilizando X509Configurer y el método withUserPrincipalName() para verificar si el certificado del cliente está disponible en el almacén de confianza.
    @Override
    protected void configure(HttpSecurity http) throws Exception {
      http
        .authorizeRequests()
          .antMatchers("/callback/**").authenticated()
          .anyRequest().permitAll()
          .and()
        .x509()
          .subjectPrincipalRegex("CN=(.*?)(?:,|$)")
          .withUserPrincipalName()
          .and()
        .sessionManagement()
          .sessionCreationPolicy(SessionCreationPolicy.NEVER);
    }
    
    1. Para el punto final /.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étodo configure(WebSecurity web).
    @Override
    public void configure(WebSecurity web) throws Exception {
      web
        .ignoring()
        .antMatchers("/.well-known/**");
    }
    

    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.

Comments are closed.