TLS/SSL avec Undertow

Cette page a été rédigée il y a fort fort longtemps, et n'a pas tellement été mise à jour.

 

Vous savez, moi je ne crois pas qu'il y ait de bonne ou de mauvaise page. Moi, si je devais résumer mon wiki aujourd'hui avec vous, je dirais que c'est d'abord des rencontres. Des gens qui m'ont tendu la main, peut-être à un moment où je ne pouvais pas, où j'étais seul chez moi. Et c'est assez curieux de se dire que les hasards, les rencontres forgent une destinée... Parce que quand on a le goût de la chose, quand on a le goût de la chose bien faite, le beau geste, parfois on ne trouve pas l'interlocuteur en face je dirais, le miroir qui vous aide à avancer. Alors ça n'est pas mon cas, comme je disais là, puisque moi au contraire, j'ai pu ; et je dis merci au wiki, je lui dis merci, je chante le wiki, je danse le wiki... je ne suis qu'amour ! Et finalement, quand des gens me disent « Mais comment fais-tu pour avoir cette humanité ? », je leur réponds très simplement que c'est ce goût de l'amour, ce goût donc qui m'a poussé aujourd'hui à entreprendre une construction logicielle... mais demain qui sait ? Peut-être simplement à me mettre au service de la communauté, à faire le don, le don de soi.

Undertow est un serveur Web Java avec lequel il est facile de démarrer.

Le support de SSL apporte un léger surplus de compléxité. Juste quelques lignes de code.

Certificat

Undertow utilise la classe java.security.Keystore. C’est donc elle qui impose les formats supportés.

C’est donc naturellement que Undertow supporte des certificats de type

  • JKS, générés avec l’outil keytool du JDK

  • PKCS12, créés avec OpenSSL

Dans l’exemple ci-dessous, j’ai utilisé un certificat PKCS12 généré comme ceci :

openssl req -newkey RSA:2048 -nodes -keyout undertow.key -x509 -days 365 -out undertow.crt
openssl pkcs12 -inkey undertow.key -in undertow.crt -export -out undertow.pfx
rm undertow.key && rm undertow.crt

J’ai ensuite placé le fichier undertow.pfx dans le répertoire resources de mon projet afin qu’il se retrouve à la racine du fichier jar construit.

Démarrage

Au démarrage, au lieu du HttpListener, il faut ajouter un HttpsListener avec un context SSL qui contient le certificat.

   public static void main(final String[] args) throws Exception {
       ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

       KeyStore keyStore = KeyStore.getInstance(KEYSTORE_TYPE);
       keyStore.load(
               classLoader.getResourceAsStream(KEYSTORE_FILE),
               KEYSTORE_PASSWORD.toCharArray());
       KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
       keyManagerFactory.init(keyStore, KEYSTORE_PASSWORD.toCharArray());

       SSLContext sslContext = SSLContext.getInstance(TLS_VERSION);
       sslContext.init(keyManagerFactory.getKeyManagers(), null, null);

       Undertow sslServer = Undertow.builder()
               .addHttpsListener(8001, "localhost", sslContext)
               .setHandler(Start::hello)
               .build();
       sslServer.start();
   }