Cet article décrit comment configurer un SSL dans une application Spring Boot.
Presque tous les articles recommandent de créer un fichier Keystore à l’aide de l’outil de clé Java, et cela pourrait encore avoir un sens, mais quelque chose de nouveau est arrivé.
À partir de Spring Boot 2.7.0, La configuration de SSL pourrait être beaucoup plus simple sans utiliser l’outil clé. C’est pourquoi nous avons décidé de créer cet article.
Nous décrirons également comment générer et importer des certificats auto-signés.
Mais avant cela, nous expliquerons brièvement pourquoi nous pouvons avoir besoin d’un SSL sur un serveur.
Raisons d’avoir un SSL sur un serveur
Imaginons que vous buvez du café dans un restaurant, que votre appareil est connecté à son réseau wifi et que vous décidez de visiter un service Web contenant des données sensibles. Par exemple, vous voulez vérifier votre compte bancaire.
Il existe certains composants entre vous et le service Web, y compris le routeur Wi-Fi. Bien sûr, nous faisons confiance aux restaurants, mais nous devons nous assurer qu’aucune donnée ne pourra être capturée et utilisée contre les utilisateurs. Toutes les demandes et réponses sur un routeur wifi pourraient être enregistrées ou même collectées quelque part.
Nous ne pouvons donc pas contrôler ce que fait un routeur wifi, mais nous pouvons rendre impossible l’utilisation des requêtes et des réponses capturées. C’est l’une des raisons pour lesquelles le protocole `https` pourrait être utilisé.
Un client et un serveur échangent des messages chiffrés au cours de la session (à l’aide d’une clé de chiffrement symétrique). Et seuls un client et un serveur savent décrypter ces messages.
Ainsi, même si un routeur wifi collecte les requêtes et les réponses entre un client et un service Web, il ne sait tout simplement pas quoi en faire ; il ne peut pas les déchiffrer et comprendre exactement ce que contiennent ces messages.
En plus de cela, un client peut également vérifier la propriété d’un service Web à l’aide d’un certificat SSL.
Certificats et clés privées
Pour utiliser SSL sur votre serveur, vous devez disposer des éléments suivants :
- Un certificat émis (ou une chaîne de certificats) contenant une clé publique et données de propriété.
- Une clé privée
La combinaison de ces fichiers est également appelée paire de clés.
Une paire de clés pourrait être émise pour un seul domaine par toute autorité de certification (CA). Une autre option consiste à générer une paire de clés avec un certificat auto-signé. Mais dans ce cas, aucun site tiers ne peut confirmer la propriété de votre service Web, et les clients pourraient se plaindre de ces certificats.
De toute façon, seul un serveur doit être au courant d’une clé privée ; il est important de ne pas le partager.
Un certificat contenant une clé publique doit être exposé par un serveur aux clients. Il est impossible pour un client d’établir une connexion sécurisée avec un serveur sans lui. À l’aide d’un certificat, un client peut également vérifier la propriété du domaine (impossible pour les certificats auto-signés), vérifier la validité du certificat, etc.
Même ici et maintenant, vous pouvez trouver les détails du certificat (dans la plupart des navigateurs, vous pouvez le faire en appuyant sur un bouton de verrouillage près d’une URL). La chaîne de certificats est correcte ; Amazon vérifie que la propriété est toujours valide, contient une clé publique et que la connexion « https » a été établie avec succès.
Configuration d’un SSL dans une application Spring Boot
1. Configuration d’un port
Commençons par la partie la plus simple 🙂
Par défaut, les navigateurs et la plupart des autres clients utilisent le port 80 pour les requêtes « http » et le port 443 pour le « https », sauf si vous spécifiez explicitement un autre port dans une URL.
Ainsi, dans la plupart des cas, il est préférable de changer un port de serveur dans le fichier de propriétés de l’application en 443 :
Mais vous pouvez choisir n’importe quel autre port. Par exemple, si vous spécifiez le port 8443, il vous suffit de le spécifier dans l’URL ; https://127.0.0.1:8443
et ça marche aussi.
2. Importation d’un certificat et d’une clé privée
Fondamentalement, il existe deux options pour importer une paire de clés dans une application Spring Boot :
- Utilisation d’un certificat brut et de fichiers de clés privées.
- Utilisation d’un magasin de clés Java.
Option 1 : Importation directe des fichiers de certificat brut et de clé privée
C’est l’option la plus simple, et elle est disponible depuis la version Spring Boot 2.7.0.
Il est logique de ne plus utiliser l’outil de clé si vous disposez déjà d’une paire de certificat pem et d’une clé privée émise par une autorité de certification (CA), et que vous n’avez aucune intention de stocker plusieurs paires de clés dans un seul keystore déposer.
Si vous développez une application Web basée sur Spring Boot, vous pouvez simplement fournir à l’application ces fichiers et les spécifier dans un fichier de propriétés d’application (voir Notes de publication de Spring Boot 2.7.0)
Par exemple, vous pouvez placer les fichiers de certificat pem et de clé privée dans un dossier de ressources. Après cela, vous pouvez spécifier l’emplacement de ces fichiers dans les propriétés de l’application :
server:
port: 443 #this port is used for https connections in browsers by default
ssl:
certificate-private-key: classpath:keypair/privatekey.key
certificate: classpath:keypair/certificate.crt
Et c’est tout 🙂
Si vous avez une chaîne de certificats, vous pouvez les combiner dans un seul fichier certificate.crt (placez-y simplement leur contenu un par un).
Option 2 : Importer à l’aide d’un fichier de magasin de clés
Une autre option consiste à utiliser l’outil de clé Java pour gérer les fichiers du magasin de clés. Et en fait, c’était la seule option disponible avant la sortie de Spring Boot 2.7.0.
À l’aide de l’outil clé, vous pouvez créer un fichier de magasin de clés et y placer n’importe quelle quantité de paires de clés.. Mais, bien sûr, chaque certificat d’un fichier Keystore doit être identifié par un alias unique.
Donc vous pouvez placer des paires de clés émises par une autorité de certification (CA), générer des paires de clés avec des certificats auto-signés et tous les autres certificats dans un seul fichier ; utilisez simplement des alias différents pour eux. Parfois, cela peut être utile.
Il est plus facile d’utiliser l’option 1 si vous n’avez pas besoin de stocker plusieurs paires de clés dans un fichier de magasin de clés partagé commun et vous utilisez Spring Boot 2.7.0 ou une version ultérieure.
Nous avons déjà un exemple avec une paire de clés émise par une autorité de certification (CA), alors considérons comment on peut utiliser un Keystore sur l’exemple de certificats auto-signés.
Vous pouvez générer une telle paire de clés à l’aide de l’outil clé ; voir la commande ci-dessous :
keytool -genkeypair -alias my-self-signed-cert -keystore ~/projects/myproject/src/main/resources/https/local/keystore-with-self-signed-cert.keystore -keyalg RSA -storePass PasswordForStore -storetype PKCS12 -validity 365
On vous demandera votre nom, votre organisation et quelques autres détails.
Après cela, la paire de clés avec l’alias my-self-signed-cert
sera généré dans le keystore-with-self-signed-cert.keystore
fichier, la validité du certificat auto-signé est de 365 jours, mais vous pouvez spécifier toute autre valeur.
Une fois que vous avez généré un fichier keystore avec un certificat auto-signé, il vous suffit de configurer une application pour commencer à l’utiliser :
server:
port: 8443
ssl:
key-store: classpath:https/local/keystore-with-self-signed-cert.keystore
key-store-password: PasswordForStore
key-alias: my-self-signed-cert
key-store-type: PKCS12
Et c’est tout; maintenant le serveur supporte le protocole `https`. Toutes nos félicitations 🙂
Mais soyez conscient la plupart des clients ne font pas confiance aux certificats auto-signés par défaut car aucun site tiers ne peut en confirmer la propriété. Vous pouvez toujours établir une connexion sécurisée, et cela fonctionnera comme un charme, mais les clients doivent importer des certificats ou désactiver les validations de certificats.
Par exemple, si vous essayez de demander au serveur un certificat auto-signé en utilisant curl
vous pouvez voir le message suivant :
$ curl https://localhost:8443/actuator/health
...
curl: (60) SSL certificate problem: self signed certificate
curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.
Vous pouvez soit importer le certificat, soit désactiver la validation à l’aide de l’argument approprié (pour curl; --insecure
). Le même respect pour les navigateurs et la plupart des autres clients.
Conclusion
Dans cet article, nous avons décrit deux manières de configurer un SSL dans une application Spring Boot ; importation directe de une paire de clés (un certificat et une clé privée) ou en utilisant un fichier keystore contenant une ou plusieurs paires de clés.
Si vous avez besoin de gérer plusieurs paires de clés dans un seul fichier de magasin de clés, vous pouvez le faire à l’aide de l’outil clé et vous pouvez facilement importer un magasin de clés dans une application Spring Boot.
Mais si vous n’avez pas l’intention d’utiliser un stockage commun pour plusieurs paires de clés et que vous utilisez Spring Boot 2.7.0 ou une version ultérieure, vous pouvez envisager de ne pas utiliser l’outil clé du tout. Au lieu de cela, importez simplement un certificat et une clé privée dans une application Spring Boot, et cela pourrait suffire.
Nous espérons que cet article pourra être utile à quelqu’un 🙂 Merci d’avoir lu !