Configuration HTTPS sur un tomcat 9.0.45 existant
Pré-requis
Les services web et/ou tempo doivent être installés et fonctionnels en http.
Avoir le mot de passe root
Généralités
Schéma général d’une connexion sécurisée
Installation d’OpenSSL, du connecteur APR (apache portable runtime) et de la librairie Tomcat native
Ajout d’un connecteur APR OpenSSL Apache tomcat
Les tomcats installés jusque-là utilisaient le connecteur NIO et JSSE. Pour gérer au mieux les certificats et la sécurité nous allons utiliser des connecteurs APR/native tomcat et OpenSSL.
Installation des paquets
Nous allons installer s’ils ne sont pas déjà présents les paquets OpenSSL, APR et GCC (pour compiler les librairies Native Tomcat)
Installation d’OpenSSL
Se connecter en root sur l’environnement.
Taper la commande suivante :
yum install openssl-devel
Taper y et entrée
OpenSSL est installé.
Installation du connecteur APR
Taper la commande suivante :
yum install apr-devel
Taper y et entrée
Taper ensuite :
yum install apr-util
Taper y et entrée
Le connecteur APR est installé.
Installation de GCC
Taper la commande suivante :
yum install gcc
Taper y et entrée.
GCC est installé.
Compilation des librairies Native Tomcat
Taper les commandes suivantes :
cd /Outils/apache-tomcat-9.0.45/bin
gunzip tomcat-native.tar.gz
tar -xvf tomcat-native.tar
cd tomcat-native-1.2.27-src/native
./configure
La commande doit se terminer correctement sans erreur !
make
make install
Les commandes doivent se terminer ainsi :
Il faut ensuite copier les librairies APR dans le dossier /usr/lib/
cp /usr/local/apr/lib/*.* /usr/lib/
Création de l’autorité de certification et du certificat (cas d’un certificat autosigné)
Fonctionnement d’une autorité de certification :
Nous allons installer une autorité de certification sur le linux qui va signer le certificat pour le tomcat. Nous aurons ainsi une chaîne de certification acceptable par les navigateurs internet modernes.
Créer un répertoire où stocker les certificats et les clés. On va créer un répertoire nommé PKI dans le répertoire etc. Les clés privées sont des données sensibles, nous mettrons des droits restreints sur ce répertoire à la fin de la procédure. Le nom du serveur que j’utilise ici dans les différents fichiers de configuration et captures d’écran est vmsaplinux et le répertoire d’installation est /Diap1/START41617/. A modifier en fonction de votre environnement.
(Pour des raisons de sécurité nous mettons les certificats dans le répertoire /etc/PKI)
cd /etc
mkdir PKI
cd PKI
Génération de la clé privée de l’autorité de certification
openssl genrsa -aes128 -out vmsaplinuxCA.key
(remplacer vmsaplinux par le nom du serveur)
Choisir un mot de passe puis le confirmer. Il faut le renseigner immédiatement dans le keepass.
Génération du certificat de l’autorité de certification :
openssl req -x509 -new -nodes -key vmsaplinuxCA.key -sha256 -days 30 -out vmsaplinuxCA.pem
vmsaplinuxCA.key représente la clé privée créée à l’étape précédente. Mettez le nom que vous avez choisi. Adaptez également vmsaplinuxCA.pem en fonction du nom du serveur.
-days 90 indique le nombre de jours de validité pour le certificat de l’autorité de certification. On met 1 mois par défaut. C’est ensuite au client de prendre en charge la gestion du certificat.
Entrer le mot de passe de la clé privée, et répondre aux différentes questions (l’exemple ci-dessous peut être utilisé pour un environnement interne Isia).
Important :
Pour un client entrer les informations du client, pas celles d’Isia !
Pour le ‘common name’ entrer le nom du serveur !
On peut laisser l’adresse mail vide.
Notre autorité de certification est créée, nous avons le certificat et la clé privée.
Génération de la clé privée pour le tomcat (on ne crypte pas cette clé (-aes128) sinon le mot de passe de la clé est demandé à chaque démarrage du tomcat)
openssl genrsa -out vmsaplinux.key 2048
Génération de la demande de certificat pour le tomcat
openssl req -new -key vmsaplinux.key -out vmsaplinux.csr
vmsaplinux.key représente la clé privée créée à l’étape précédente. Mettez le nom que vous avez choisi. Adaptez également vmsaplinux.csr en fonction du nom du serveur.
Entrer le mot de passe de la clé privée, et répondre aux différentes questions (l’exemple ci-dessous peut être utilisé pour un environnement interne Isia).
Important :
Pour un client entrer les informations du client, pas celles d’Isia !
Pour le ‘common name’ entrer le nom du serveur !
Ne pas entrer de mot de passe dans le champ « A challenge password »
On peut laisser l’adresse mail vide.
Création du fichier .ext pour la signature du certificat
Créer un fichier demande.ext avec le contenu suivant (changer dans la dernière ligne vmsaplinux par le nom du serveur sur lequel vous êtes) :
vim demande.ext
En fonction de l’infrastructure informatique du client ce fichier peut être plus complexe. Si en mettant uniquement le nom de la machine on n’accède pas au tomcat c’est que cet ordinateur a un autre nom DNS ou une configuration particulière. On peut également rajouter l’IP. Voici le fichier pour le serveur ISIA srv-licences :
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = SRV-LICENCES
DNS.2 = SRV-LICENCES.elcia-2004.local
DNS.3 = srv-licences
IP.1 = 192.9.250.26
Pour déterminer les différents éléments à rajouter dans le fichier j’ai fait un ping à partir d’une machine windows. On voit qu’il y a un nom DNS différent : srv-licences.elcia-2004.local. On peut également rajouter l’IP. En cas de changement de ces éléments il faudra renouveler le certificat.
Signature du certificat du tomcat par notre autorité de certification
openssl x509 -req -in vmsaplinux.csr -CA vmsaplinuxCA.pem -CAkey vmsaplinuxCA.key -CAcreateserial -out vmsaplinux.crt -days 90 -sha256 -extfile demande.ext
openssl x509 -req -in vmsaplinux.csr -CA vmsaplinuxCA.pem -CAkey vmsaplinuxCA.key -CAcreateserial -out vmsaplinux.crt -days 30 -sha256 -extfile demande.ext
Il faut modifier les noms de certificats et de clés (en gras dans la commande) en fonction de ce que vous avez saisi dans les étapes précédentes.
-days 30 indique le nombre de jours de validité pour le certificat du tomcat. Comme pour la clé privée on met 1 mois par défaut. C’est ensuite au client de prendre en charge la gestion du certificat.
Entrer le mot de passe de la clé privée de l’autorité de certification quand c’est demandé.
Nous devons maintenant avoir tous ces fichiers dans le répertoire :
Mise à jour de la configuration des certificats du linux
Copier les certificats (le certificat complet contenant la chaîne de certification) dans le répertoire contenant les autorités de certification du linux.
cp *.pem *.crt /etc/pki/ca-trust/source/anchors/
Mettre à jour la configuration des certificats :
update-ca-trust
Sécurisation du répertoire et des clés
Les clés privées sont des données sensibles, nous devons nous assurer que les droits soient restreints.
Remonter d’un niveau, et s’assurer que seul l’utilisateur root (ou diapdba) y ont accès
cd ..
chown -R diapdba:ISIA PKI
chmod -R 700 PKI
Installation d’un certificat acheté auprès d’un fournisseur
Le client a acheté un certificat pour son nom de domaine auprès d’un fournisseur du commerce.
Modifier le fichier /etc/hosts et rajouter le nom souhaité avec un des noms de domaine inclus dans le certificat. Dans l’exemple ci-dessous on configure le serveur srv-licences avec le certificat isia.fr.
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.9.250.26 SRV-LICENCES srv-licences.isia.fr
Le client doit faire le nécessaire au niveau de sa configuration DNS pour que le serveur soit accessible avec le bon nom de domaine.
Copier le certificat et sa clé dans un répertoire sécurisé sur le serveur (par exemple dans le répertoire /etc/pki en s’assurant que le répertoire configuré en 700. Aller dans le répertoire /etc (ou celui que vous avez choisi) et taper les commandes suivantes :
cd ..
chown -R diapdba:ISIA
chmod -R 700 PKI
Mettre à jour les certificats de racine du linux. Taper la commande suivante :
update-ca-trust
Paramétrage du tomcat
Éditer le fichier server.xml d’apache pour activer le https.
cd /Outils/apache-tomcat-9.0.45/conf
vim server.xml
Ajouter ce paragraphe :
<Connector protocol="org.apache.coyote.http11.Http11AprProtocol" port="443"
maxThreads="200" maxParameterCount="1000" scheme="https" secure="true" SSLEnabled="true"
SSLCertificateFile="/etc/PKI/vmsaplinux.crt"
SSLCertificateKeyFile="/etc/PKI/vmsaplinux.key"
SSLVerifyClient="optional" SSLProtocol="TLSv1+TLSv1.1+TLSv1.2" />
Important : les lignes SSLCertificateFile et SSLCertificateKeyFile sont à adapter en fonction de vos répertoires et noms de certificat et de clé !
J’ai utilisé le port 443, vous pouvez en utiliser un autre (le 8443 en général) s’il est déjà utilisé. (3e ligne port="443" maxThreads="200" )
Pour vérifier si le port est utilisé taper la commande suivante :
netstat -anop | grep 443
Commenter ou supprimer le paragraphe ci-dessous pour interdire le port 8080.
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
redirectPort="8443" />
Si on souhaite utiliser les 2 ports https :8443 et http :8080 il faut uniquement supprimer ou commenter la ligne redirectPort="8443"
On pourra alors se connecter au tomcat en https et http. Ceci n'est pas souhaitable, à faire uniquement en cas de problème important nécessitant de repasser en http.
Ce qui donne si on utilise le port 8443 pour le https :
<Connector protocol="org.apache.coyote.http11.Http11AprProtocol" port="8443" maxThreads="200"
maxParameterCount="1000" scheme="https" secure="true" SSLEnabled="true"
SSLCertificateFile="/etc/PKI/vmsaplinux.crt"
SSLCertificateKeyFile="/etc/PKI/vmsaplinux.key"
SSLVerifyClient="optional" SSLProtocol="TLSv1+TLSv1.1+TLSv1.2" />
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000" />
Redémarrer le tomcat
/Outils/apache-tomcat-9.0.45/stoptomcat.sh
/Outils/apache-tomcat-9.0.45/starttomcat.sh
Vérification du fonctionnement
Vérification directe sur le linux
Dans le cas (très rare) où on peut avoir un navigateur web sur le linux, accéder à l’URL du tomcat de votre serveur. Dans mon cas :
Dans cet exemple j’ai configuré le https sur le port par défaut 443, je n’ai donc pas à le spécifier dans l’URL. Si vous avez pris un autre port il faut le spécifier dans l’URL. Par exemple pour le port 8443 : https://vmsaplinux:8443/
Le tomcat est bien en https, la chaine de certificat est correcte :
Vérification sur une autre machine
Dans la plupart des cas nous n’avons pas de navigateur web sur le linux. Il faut alors vérifier le fonctionnement sur une machine windows, le TSE généralement. Il va être nécessaire d’importer le certificat de l’autorité de certification.
Première étape, récupérer le certificat de l’autorité de certification (dans mon cas vmsaplinuxCA.pem) avec filezilla ou winscp par exemple.
Sur Chrome, Edge ou encore Brave (pour firefox voir plus bas) :
Nous devons rajouter notre certificat dans les autorités de certification de l’ordinateur.
Cliquer sur le bouton démarrer, taper certi et cliquer sur Gérer les certificats d’ordinateur.
Faire un clic droit sur Autorités de certification racines de confiance, Toutes les tâches, Importer.
Cliquer sur Suivant
Cliquer sur Parcourir, aller dans le répertoire où vous avez copié le certificat. Dans la liste déroulante en bas à droite sélectionner Tous les fichiers. Sélectionner le certificat et cliquer sur Ouvrir.
Cliquer sur Suivant
Bien vérifier que le certificat est placé dans le magasin Autorités de certification racine de confiance (sinon modifier le magasin en cliquant sur Parcourir…)
Cliquer sur Terminer
Cliquer sur OK
On peut maintenant tester notre tomcat sur chrome, edge ou brave :
Installation du certificat de l’autorité de certification sur firefox
Firefox gère les certificats différemment. Si c’est le seul navigateur internet disponible voici les manipulations :
Lancer Firefox, cliquer sur le bouton en haut à droite puis sur Paramètres
Cliquer sur Vie privée et sécurité
Cliquer sur Afficher les certificats.
Cliquer sur Importer
Récupérer le bon certificat et cliquer sur Ouvrir
Cocher Confirmer cette AC pour identifier des sites web et cliquer sur OK.
Entrer l’URL du Tomcat en https. La connexion est sécurisée.
Modification du diapason.ini
Editer le fichier diapason.ini de l’environnement.
Remplacer la ligne
DIAP_TOMCAT_URL_LOC http://nomduserveur:8080
DIAP_TOMCAT_URL_LOC http://vmsaplinux:8080
par
DIAP_TOMCAT_URL_LOC https://nomduserveur:port
Exemple pour le port 443 :
DIAP_TOMCAT_URL_LOC https://nomduserveur:443
DIAP_TOMCAT_URL_LOC https://vmsaplinux:443
ou bien par exemple pour le port 8443 :
DIAP_TOMCAT_URL_LOC https://vmsaplinux:8443
Lancer un ./diapadm A11
Tempo
En cas de certificat autosigné il est nécessaire de l’importer sur le serveur tempo.
Récupérer le fichier correspondant au certificat de l’autorité de certification (dans notre exemple vmsaplinuxCA.pem) sur le serveur linux avec filezilla ou winscp et le copier sur le serveur Tempo.
Cliquer sur le bouton démarrer, taper certi et cliquer sur Gérer les certificats d’ordinateur. VVous devez avoir les droits administrateur du serveur.
Faire un clic droit sur Autorités de certification racines de confiance, Toutes les tâches, Importer.
Cliquer sur Suivant
Cliquer sur Parcourir, aller dans le répertoire où vous avez copié le certificat. Dans la liste déroulante en bas à droite sélectionner Tous les fichiers. Sélectionner le certificat et cliquer sur Ouvrir.
Cliquer sur Suivant
Bien vérifier que le certificat est placé dans le magasin Autorités de certification racine de confiance (sinon modifier le magasin en cliquant sur Parcourir…)
Cliquer sur Terminer
Cliquer sur OK
Il faut modifier le fichier appsettings.json et passer la chaine de connexion BaseURL en https.
Se connecter sur le serveur sur lequel Tempo est installé, aller dans le répertoire IIS (par défaut C:\inetpub\wwwroot\”repertoiretempo”). Pour l’environnement Formation par exemple, se connecter sur le serveur s-i-edt-form, aller dans le répertoire C:\inetpub\wwwroot\tempo-form.local, éditer le fichier appsettings.json et remplacer dans la chaine de connexion “BaseURL” “http” par “https”
Redémarrer le IIS pour être sûr que la modification soit prise en compte.
Chercher “IIS” dans le menu Démarrer et sélectionner Gestionnaire des services Internet (IIS)
Déplier le navigateur à gauche jusqu'à ouvrir la section “Sites”
Pour chaque site pointant vers la machine UNIX dont le Tomcat a été passé en HTTPS, la sélectionner et choisir “Redémarrer”.
Troobleshooting
On a configuré un certificat acheté auprès d’un fournisseur du commerce, il est en cours de validité mais les navigateurs internets indiquent un problème au niveau de l’autorité de certification.
Il faut essayer de copier sur le linux dans le répertoire /etc/pki/ca-trust/source/anchors/ tous les certificats de la chaîne de certification (autorité racine de confiance et éventuellement autorité intermédiaire) et refaire un update-ca-trust. Voir sur le site du fournisseur du certificat pour les récupérer.
On a un problème de certificat que l’on arrive pas à résoudre en production, les services web et/ou tempo ne fonctionnent plus, il faut se remettre en http en urgence.
Éditer le fichier server.xml pour ré-activer le http sur le port 8080.
cd /Outils/apache-tomcat-9.0.45/conf
vim server.xml
Ajouter ce paragraphe :
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000" />
Redémarrer le tomcat :
/Outils/apache-tomcat-9.0.45/stoptomcat.sh
/Outils/apache-tomcat-9.0.45/starttomcat.sh
Aller dans le diapason.ini et repasser l’url du tomcat en http : sur le port 8080 :
DIAP_TOMCAT_URL_LOC http://nomduserveur:8080
DIAP_TOMCAT_URL_LOC http://vmsaplinux:8080
faire un ./diapadm A11
Pour tempo ne pas oublier de modifier le fichier appsettings.json et de repasser la chaine de connexion en http :
Redémarrer le IIS pour être sûr que la modification soit prise en compte.