19 février 2015

HTTPS avec Spring Boot

Générer la clé SSL

Nous allons générer un keystore contenant une clé pour l'application Spring Boot.

Pour cela, nous nous servons du programme "keytool" installé par défaut dans Java dans le répertoire bin du JDK ou du JRE.

  • Lancer la commande suivante à la racine du projet Spring Boot :
keytool -genkey -alias [nom de la clé] -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650
, en remplaçant [nom de la clé] par le nom de l'application
  • Saisir et confirmer le mot de passe de la clé
  • Saisir le nom de l'application à la 3è question
  • Répondre aux autres questions sans obligatoirement mettre de valeur
  • Répondre à la dernière question par "yes"
Le fichier keystore.p12 a été généré à la racine du projet. Nous pouvons vérifier le contenu de ce keystore :
keytool -list -v -keystore keystore.p12 -storetype pkcs12
Cette commande affiche les informations de la clé.

Configurer Spring Boot

Nous indiquons à SpringBoot que nous utilisons le protocol HTTPS à l'aide de la clé que nous avons généré.

  • Dans le fichier src/main/resources/application.yml, ajouter les lignes suivantes :
server:
  port: 9000
  ssl.key-store: keystore.p12
  ssl.key-store-password: [mot de passe]
  ssl.keyStoreType: PKCS12
  ssl.keyAlias: [nom de l'alias]
, avec :
  • 9000 : le port HTTPS de Tomcat
  • keystore.p12 : le fichier de la clé que nous avons générée
  • [mot de passe] : le mot de passe saisi lors de la création de la clé
  • [nom de l'alias] : le nom de la clé que nous avons défini lors de sa création

Lancer l'application

  • Relancer l'application basée sur Spring Boot, via la commande :
    mvn spring-boot:run
    • Si l'exception Caused by: javax.crypto.BadPaddingException: Given final block not properly padded apparaît, cela veut dire que le mot de passe saisi dans le fichier application.yml ne correspond pas à celui de la clé
  • Accéder à la page d'accueil de l'application en utilisant le protocole HTTPS, c'est à dire en utilisant
    https://localhost:9000/[application]
    au lieu de
    http://localhost:8080/[application]