Spring Sécurité du canal HTTP/HTTPS

Sécurité des canaux HTTP / HTTPS Spring

1. Vue d'ensemble

Ce didacticiel montrehow to use HTTPS to protect your application’s login page utilisant la fonction de sécurité des chaînes de Spring.

L'utilisation de HTTPS pour l'authentification est cruciale pour protéger l'intégrité des données sensibles lors du transport.

L'article s'appuie sur lesSpring Security Login tutorial en ajoutant une couche de sécurité supplémentaire. Nous soulignons les étapes nécessaires pour sécuriser les données d'authentification en servant la page de connexion via le canal HTTPS codé.

2. Configuration initiale sans sécurité de canal

Commençons par la configuration de sécurité expliquée dans l'article susmentionné.

L'application Web permet aux utilisateurs d'accéder à:

  1. /anonymous.html sans authentification,

  2. /login.html, et

  3. autres pages (/homepage.html) après une connexion réussie.

L'accès est contrôlé par la configuration suivante:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
      .antMatchers("/anonymous*")
      .anonymous();

    http.authorizeRequests()
      .antMatchers("/login*")
      .permitAll();

    http.authorizeRequests()
      .anyRequest()
      .authenticated();

Ou via XML:


    
    
    

À ce stade, la page de connexion est disponible à l'adresse suivante:

http://localhost:8080/spring-security-login/login.html

Les utilisateurs sont en mesure de s'authentifier via HTTP. Toutefois, cela n'est pas sûr car les mots de passe seront envoyés en texte brut.

3. Configuration du serveur HTTPS

Pour ne livrer la page de connexion que sur HTTPSyour web-server must be able to serve HTTPS pages. Cela nécessite que la prise en charge deSSL/TLS soit activée.

Notez que vous pouvez utiliser un certificat valide ou générer le vôtre à des fins de test.

Supposons que nous utilisons Tomcat et que nous roulions notre propre certificat. Nous devons d'abord créer unkeystore avec un certificat auto-signé.

La génération du fichier de clés peut être effectuée à l'aide de la commande suivante dans le terminal:

keytool -genkey -alias tomcat -keyalg RSA -storepass changeit -keypass changeit -dname 'CN=tomcat'

Cela créera une clé privée et un certificat auto-signé dans le magasin de clés par défaut de votre profil utilisateur, dans votre dossier de base.

L'étape suivante consiste à modifierconf/server.xml pour le faire ressembler à ceci:



La deuxième balise SSL / TLS<Connector> est généralement commentée dans le fichier de configuration, il suffit donc de décommenter et d'ajouter des informations de keystore. Des informations complémentaires sont disponibles enTomcat’s related documentation.

Avec la configuration HTTPS en place, la page de connexion peut désormais être affichée sous l’URL suivante:

https://localhost:8443/spring-security-login/login.html

Les serveurs Web autres que Tomcat nécessiteraient une configuration différente, mais probablement similaire.

4. Configuration de la sécurité des canaux

À ce stade, nous sommes en mesure de servir la page de connexion à la fois sous HTTP et HTTPS. Cette section explique comment rendre obligatoire l'utilisation de HTTPS.

To require HTTPS for the login page modifie votre configuration de sécurité en ajoutant ce qui suit:

http.requiresChannel()
  .antMatchers("/login*").requiresSecure();

Ou ajoutez l'attributrequires-channel=”https” à votre configuration XML:

Après ce moment, les utilisateurs ne pouvaient se connecter qu’avec HTTPS. Tous les liens relatifs, par exemple un transfert vers/homepage.html héritera du protocole de la demande d'origine et sera servi sous HTTPS.

Lorsque vous mélangez des requêtes HTTP et HTTPS dans une seule application Web, vous devez prendre en compte d'autres aspects, qui nécessitent une configuration supplémentaire.

5. Mélanger HTTP et HTTPS

Du point de vue de la sécurité, tout servir sur HTTPS est une bonne pratique et un objectif solide.

Cependant, si l'utilisation exclusive de HTTPS n'est pas une option, nous pouvons configurer Spring pour qu'il utilise HTTP en ajoutant ce qui suit à la configuration:

http.requiresChannel()
  .anyRequest().requiresInsecure();

Ou ajoutez les attributsrequires-channel=”http” au XML:

Cela indique à Spring d'utiliser HTTP pour toutes les demandes qui ne sont pas explicitement configurées pour utiliser HTTPS, mais en même temps, cela rompt le mécanisme de connexion d'origine. Les sections suivantes expliquent la cause sous-jacente.

5.1. Une URL de traitement de connexion personnalisée via HTTPS

La configuration de la sécurité du didacticiel de sécurité d'origine contient les éléments suivants:

Without forcing /perform_login to use HTTPS a redirect would happen to the HTTP variant of it, losing the login information envoyé avec la demande d'origine.

Pour résoudre ce problème, nous devons configurer Spring afin qu'il utilise HTTPS pour l'URL de traitement:

http.requiresChannel()
  .antMatchers("/login*", "/perform_login");

Notez l'argument supplémentaire/perform_login passé à la méthodeantMatchers.

L'équivalent dans la configuration XML nécessite l'ajout d'un nouvel élément<intercept-url> à la configuration:

Si votre propre application utilise lelogin-processing-url par défaut (qui est/login), vous n’avez pas besoin de le configurer explicitement car le modèle/login* couvre déjà cela.

Avec la configuration en place, les utilisateurs peuvent se connecter, mais pas accéder aux pages authentifiées, par exemple. /homepage.html sous le protocole HTTP, à cause deSpring’s session fixation protection feature.

5.2. Désactivation desession-fixation-protection

Session fixation est un problème qui ne peut être évité lors du basculement entre HTTP et HTTPS.

Par défaut, Spring crée un nouveausession-id après une connexion réussie. Lorsqu'un utilisateur charge la page de connexion HTTPS, le cookiesession-id de l'utilisateur sera marqué commesecure. Après la connexion, le contexte passera à HTTP etthe cookie will be lost car HTTP n'est pas sécurisé.

Pour éviter cesetting session-fixation-protection to none is required.

http.sessionManagement()
  .sessionFixation()
  .none();

Ou via XML:

Disabling session fixation protection might have security implications, vous devez donc peser le pour et le contre si vous êtes préoccupé par les attaques basées sur la fixation de session.

6. Test

Après avoir appliqué toutes ces modifications de configuration, accéder à/anonymous.html sans se connecter (en utilisant soithttp:// soit https: //) vous redirigera vers la page via HTTP.

Ouvrir d'autres pages directement comme/homepage.html devrait vous faire rediriger vers la page de connexion via HTTPS et après la connexion, vous serez redirigé vers/homepage.html en utilisant HTTP.

7. Conclusion

Dans ce didacticiel, nous avons examiné comment configurer une application Web Spring qui communique via HTTP, à l'exception du mécanisme de connexion. Cependantnew modern web-applications should almost always use HTTPS exclusively comme protocole de communication. Réduire les niveaux de sécurité ou désactiver les fonctionnalités de sécurité (commesession-fixation-protection) n'est jamais une bonne idée.

Ce tutoriel est basé sur lescodebase available on GitHub. La configuration de la sécurité du canal peut être activée en répertorianthttps commeSpring profile actifs.