Configuration de HTTP/2 avec Spring Boot et Undertow

Pour exlpoiter les avantages de HTTP/2, notamment le multiplexage des requêtes et la réduction de la latence, il est possible d'intégrer ce protocole dans une application Spring Boot en utilisant le conteneur Undertow. Cette approche nécessite la mise en place de TLS, car la plupart des navigateurs n'acceptent HTTP/2 que sur des connexions sécurisées.

Génération d'un certificat SSL auto-signé

Comme TLS est obligatoire, nous créons un certificat auto-signé avec l'outil keytool inclus dans le JDK. Exécutez la commande suivante pour générer un fichier de clé au format PKCS12 :

keytool -genkey -alias monserveur -storetype PKCS12 -keyalg RSA -keysize 4096 -keystore monkeystore.p12 -dname "CN=localhost, OU=dev, O=maentreprise, L=paris, ST=iledefrance, C=FR"

Cela produira un fichier monkeystore.p12 à utiliser pour la configuration SSL.

Prise en charge de la négociation ALPN

ALPN (Application Layer Protocol Negotiation) est un mécanisme permettant au client et au serveur de convenir d'utiliser HTTP/2 pendant la poignée de main TLS. Pour que la JVM supporte cette négociation, il faut inclure la bibliothèque alpn-boot de Jetty au classptah au démarrage de l'application. La commande de lancement doit être adaptée ainsi :

java -Xbootclasspath/p:chemin/vers/alpn-boot-8.1.13.v20181017.jar -jar monapplication.jar

La version de alpn-boot dépend de votre version de JDK ; consultez la documentation de Jetty pour les correspondances.

Activation de HTTP/2 dans Spring Boot

Configurez Spring Boot pour utiliser Undertow avec HTTP/2 activé. Ajoutez un bean de configuration :

@Bean
public UndertowServletWebServerFactory servletContainerFactory() {
    UndertowServletWebServerFactory usine = new UndertowServletWebServerFactory();
    usine.addBuilderCustomizers(construteur -> 
        construteur.setServerOption(UndertowOptions.ENABLE_HTTP2, true));
    return usine;
}

Dans le fichier application.properties, spécifiez les paramètres SSL :

server.port=8443
server.ssl.key-store=classpath:monkeystore.p12
server.ssl.key-store-password=motdepasse
server.ssl.key-store-type=PKCS12
server.ssl.key-alias=monserveur
server.ssl.protocol=TLSv1.2

Exemple de contrôleur REST

Créez un contrôleur simple pour tester le service :

@RestController
@RequestMapping("/api")
public class MonControleur {

    @GetMapping("/salut")
    public String direBonjour() {
        return "Bienvenue en HTTP/2!";
    }
}

Démarrez l'application avec la commande incluant alpn-boot mentionnée précédemment. Accédez ensuite à https://localhost:8443/api/salut via un navigateur. Comme le certificat est auto-signé, un avertissement de sécurité s'affichera, mais la connexion utilisera bien HTTP/2, ce que vous pouvez vérifier avec les outils de développement du navigateur.

Étiquettes: Spring Boot HTTP/2 Undertow ALPN TLS

Publié le 4 juillet à 06h16