• Archiv der Kategorie: Security

HTTPS mit Client-Authentifizierung via Client-Zertifikat (Beispiel mit Spring Boot)

Bealdung hat bietet uns einen wunderbares Tutorial X.509 Authentication in Spring Security zum Thema, welchen ich hier verarbeite/zusammenfasse. Die vollständigen Sourcen sind auf GitHub verfügbar.

Zertifikates & -Stores erstellen

Das Makefile beinhaltet die ganze Magie des

  1. Erstellens eines Keystores (für das Server-Certifikat, das den Server ausweisen wird)
  2. Erstellens eines Certificate Signing Requests
  3. Des selbst signierens desselben CSRs (würde in Scharfem Modus von einer wirklichen Certificate Authority gemacht)
  4. Erstellens eines TrustStores (für die Client-Certificate Trust Authority)
  5. Erstellens eines Client Certificates, exportieren desselbens

Definition von HTTPS des integrated Tomcat

Wird durch diese wenigen config entries in application.properties erreicht:

server.ssl.key-store=../keystore/keystore.jks
server.ssl.key-store-password=changeit
server.ssl.key-alias=localhost
server.ssl.key-password=changeit
server.ssl.enabled=true
server.port=8443
security.user.name=Admin
security.user.password=admin
server.ssl.trust-store=../keystore/truststore.jks
server.ssl.trust-store-password=changeit
server.ssl.client-auth=need

Definition der Zugriffsberechtigung in der SPRING-Boot-Applikation

Die ganze Magie der Zugriffs-Berechtigungs-Verwaltung wird  durch die Annotationen @EnableWebSecurity repektive @EnableGlobalMethodSecurity und das Ableiten von WebSecurityConfigurerAdapter  und dessen überschreibene Methode configure bewerkstelligt.

@SpringBootApplication
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class X509AuthenticationServer extends WebSecurityConfigurerAdapter {
    public static void main(String[] args) {
        SpringApplication.run(X509AuthenticationServer.class, args);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().authenticated().and().x509().subjectPrincipalRegex("CN=(.*?)(?:,|$)").userDetailsService(userDetailsService());
    }

    @Bean
    public UserDetailsService userDetailsService() {
        return new UserDetailsService() {
            @Override
            public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
                if (username.equals("cid")) {
                    return new User(username, "", AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_USER"));
                }
                throw new UsernameNotFoundException("User not found!");
            }
        };
    }
}

Die configure-Methode hat also schon via 

http.authorizeRequests().anyRequest().authenticated().and().x509()

Zugriff auf das vom Web-Server empfangene Zertifikat und kann es auswerten.

 

Client Zertifikat in Firefox registrieren

Siehe Tutorial X.509 Authentication in Spring Security

 

Schließen