Configuration de la communication sécurisée Back = Robiot - Juliette3529/Timber-Wall-E GitHub Wiki

Prérequis

  • Avoir un JDK + JRE installés
  • Avoir vérifié le bon fonctionnement de l'utilitaire keytool fourni à l'installation de Java
  • Avoir le projet Robiot qui tourne normalement en local

Sécurisation du lien entre le Back et le Robiot

Génération préalable des "key stores"

Pour le Back

  • Générer un "keystore" avec un certificat initial :
    • Lancer keytool -genkeypair -alias spring -keyalg RSA -keysize 4096 -keystore keystore.jks -validity 3650 et renseigner un mot de passe.
    • La saisie interactive d'informations complémentaires n'est pas importante. À remplir (ou pas) comme vous souhaitez.
    • Placer ce keystore dans le répertoire resources du projet.

Pour le Robiot

  • Générer un "keystore" avec un certificat initial :
    • Lancer keytool -genkeypair -alias robiot_local -keyalg RSA -keysize 4096 -keystore keystore.jks -validity 3650 et renseigner un mot de passe.
      • Important : Il vous sera demandé "votre nom et votre prénom" ; il faut renseigner obligatoirement 127.0.0.1, sans quoi le Back ne validera pas les connexion avec le Robiot par la suite (vérifier à la fin de la saisie interactive que CN=127.0.0.1).
    • Placer ce keystore dans un dossier ssl à la racine de tomcat.

Génération des "trust stores"

Pour le back

  • Extraire le certificat de Robiot pour ensuite l'ajouter aux certificats de confiance du Back :
    • Lancer keytool -export -keystore keystore.jks -file robiot.cert -alias robiot_local
  • Ajouter ce certificat aux certificats de confiance du Back :
    • Ajouter le précédent certificat au trust store du Back avec keytool -import -keystore truststore.jks -file robiot.cert -alias robiot_local et choisir un mot de passe

Pour le Robiot

  • Extraire le certificat du Back pour ensuite l'ajouter aux certificats de confiance du Robiot :
    • Lancer keytool -export -keystore keystore.jks -file spring.cert -alias spring
  • Ajouter ce certificat aux certificats de confiance du Robiot :
    • Ajouter le précédent certificat au trust store du Robiot avec keytool -import -keystore truststore.jks -file robiot.cert -alias robiot_local et choisir un mot de passe

Configuration des environnements

Configuration du Back

Il suffit de déclarer trois variables d'environnement :

Configuration du Robiot

  • Dans le fichier server.xml du tomcat du Robiot, commenter le connecteur par défaut du port 8080
  • Dans ce même fichier, ajouter un nouveau connecteur :
<Connector
            protocol="org.apache.coyote.http11.Http11Nio2Protocol"
            port="8443" maxThreads="200"
            scheme="https" secure="true" SSLEnabled="true"
            keystoreFile="/usr/local/tomcat/ssl/keystore.jks" keystorePass="${MOT DE PASSE KEY STORE}"
            truststoreFile="/usr/local/tomcat/ssl/truststore.jks"  truststorePass="${MOT DE PASSE TRUST STORE}"
            keyAlias="robiot_local"
            sslProtocol="TLS" clientAuth="true"
    />
  • Remplacer les sections indiquées par ${QUELQUE CHOSE} par leur valeur.

    Cela devrait désactiver le port non sécurisé et en créer un sécurisé sur le port 8443.

Notes

  • Pour déployer le Robiot sur une machine distante, remplacer toutes les occurrences de 127.0.0.1 avec l'adresse IP (ou le nom de domaine) qui sera utilisée par le client pour les communications. Attention, si vous voulez utiliser à la fois l'adresse IP de votre machine et son nom de domaine, il faudra générer deux certificats dans le key store du Robiot, et ajouter les deux certificats au trust store du Back.
  • Il est possible de rediriger les requêtes non sécurisées au lieu de les bloquer en laissant le Connector original dans le fichier server.xml et d'ajouter ce qui suit au fichier web.xml de l'application :
  <security-constraint>
    <web-resource-collection>
      <web-resource-name>Secured</web-resource-name>
      <url-pattern>/*</url-pattern>
    </web-resource-collection>

    <user-data-constraint>
      <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
  </security-constraint>