Installation EJBCA sous CentOS

Dans cet article, je vous propose un mode opératoire pour l’installation de la solution EJBCA Community Edition en version 6.10.1.2 sur une CentOS 7.

La machine virtuelle que j’ai utilisée pour cela dispose de 2vCPU, 4Go de RAM et 50 Go de disque.

Dans cet article, je n’invente rien et paraphrase souvent d’autres articles (cités dans mes sources). C’est juste une centralisation avec quelques explications autour.

J’ai utilisé cette méthode sur une maquette. C’est à dire que je n’ai pas cherché à optimiser / endurcir particulièrement le système.

Préparation du système

Pour l’installation de ma PKI, je vais commencer par mettre à jour mon système et y installer quelques utilitaires.

sudo yum update
sudo yum install vim ntp ntpdate epel-release wget tar unzip java-1.8.0-openjdk-devel ant psmisc mariadb bc patch
sudo yum update
sudo yum install htop

Pour ne pas être bloqué par la suite, je désactive complètement le Firewall du système. Je me permet cela uniquement car je suis sur un environnement de maquette.

sudo systemctl status firewalld
sudo systemctl stop firewalld
sudo systemctl disable firewalld

Une PKI possède une adhérence particulière avec les services de temps. Au sein de ma maquette je dispose d’un serveur de temps en 192.168.1.1 auquel je me synchronise manuellement via ntpdate pour commencer.

sudo ntpdate 192.168.1.1

Par la suite, je configure mon fichier /etc/ntp.conf avec les éléments suivants.

server 192.168.1.1
server 127.127.1.0
fudge 127.127.1.0 stratum 10

Puis je démarre le service ntpd et vérifie son bon fonctionnement.

sudo systemctl enable ntpd
sudo systemctl start ntpd
sudo ntpq -p

Installation de wildfly

Pour cette plateforme j’ai fais le choix d’utiliser wildfly en version 10.1.0 Final qui est identifié comme supporté par la version d’EJBCA que j’ai utilisé.

On commence par télécharger la version de wildfly sur le serveur.

cd /tmp
wget https://download.jboss.org/wildfly/10.1.0.Final/wildfly-10.1.0.Final.tar.gz

On l’installe dans /opt, on crée un utilisateur dédié et prépare le système pour son exécution automatique.

sudo groupadd -r wildfly
sudo useradd -r -g wildfly -d /opt/wildfly -s /sbin/nologin wildfly
sudo tar xf /tmp/wildfly-10.1.0.Final.tar.gz -C /opt/
sudo ln -s /opt/wildfly-10.1.0.Final /opt/wildfly
cd /opt
sudo chown -RH wildfly: /opt/wildfly
sudo mkdir -p /etc/wildfly
sudo cp /opt/wildfly/docs/contrib/scripts/systemd/wildfly.conf /etc/wildfly/
sudo cp /opt/wildfly/docs/contrib/scripts/systemd/launch.sh /opt/wildfly/bin/
sudo sh -c 'chmod +x /opt/wildfly/bin/*.sh'
sudo cp /opt/wildfly/docs/contrib/scripts/systemd/wildfly.service /etc/systemd/system/

Ensuite, je vais positionner les paramètres Java XMX et XMS à des valeurs permettant à EJBCA de s’exécuter convenablement. Pour cela il faut éditer le fichier /opt/wildfly/bin/standalone.conf dans lequel il faut changer le paramètre $JAVA_OPTS par:

JAVA_OPTS="-Xms2048m -Xmx2048m -Djava.net.preferIPv4Stack=true"

On peut ensuite démarrer le service wildfly.

sudo systemctl daemon-reload
sudo systemctl enable wildfly
sudo systemctl start wildfly

Installation / préparation de la base de données mariadb

L’étape d’après est l’installation et la préparation de la base de données mariadb.

Il faut commencer par installer le paquet, démarrer le service associé puis procéder à la sécurisation basique du service.

sudo yum install mariadb-server
sudo systemctl enable mariadb
sudo systemctl start mariadb
sudo mysql_secure_installation

Il faut ensuite télécharger et injecter dans widlfly le driver de connexion java à une base mariadb. Je n’utilise pas la dernière version stable par facilité. J’ai en fait utilisé la même version que celle que l’installeur automatisé utilise. Je suis ainsi certain du bon fonctionnement du tout par la suite. En tant que root je réalise les actions suivantes:

cd /tmp
wget https://downloads.mariadb.com/Connectors/java/connector-java-2.2.0/mariadb-java-client-2.2.0.jar
sudo -u wildfly cp /tmp/mariadb-java-client-2.2.0.jar /opt/wildfly/standalone/deployments/mariadb-java-client.jar

Il faut ensuite créer le schéma et l’utilisateur pour la base de données.

mysql -u root -p
mysql> CREATE DATABASE ejbca CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql> GRANT ALL PRIVILEGES ON ejbca.* TO 'ejbca'@'localhost' IDENTIFIED BY 'ejbcapassword';

Puis on va créer la datasource dans wildfly. Pour se faire il faut réaliser les tâches suivantes:

cd /opt/wildfly/bin
./jboss-cli.sh -c	 	 
> data-source add --name=ejbcads --driver-name="mariadb-java-client.jar" --connection-url="jdbc:mysql://127.0.0.1:3306/ejbca" --jndi-name="java:/EjbcaDS" --use-ccm=true --driver-class="org.mariadb.jdbc.Driver" --user-name="ejbca" --password="ejbcapassword" --validate-on-match=true --background-validation=false --prepared-statements-cache-size=50 --share-prepared-statements=true --min-pool-size=5 --max-pool-size=150 --pool-prefill=true --transaction-isolation=TRANSACTION_READ_COMMITTED --check-valid-connection-sql="select 1;"	 	 
> :reload

Il est ensuite nécessaire d’activer des services d’accès distant JBOSS nécessaires pour EJBCA ainsi que quelques fonctionnalités de traçabilité.

cd /opt/wildfly/bin
./jboss-cli.sh -c
> /subsystem=remoting/http-connector=http-remoting-connector:remove
> /subsystem=remoting/http-connector=http-remoting-connector:add(connector-ref="remoting",security-realm="ApplicationRealm")
> /socket-binding-group=standard-sockets/socket-binding=remoting:add(port="4447")
> /subsystem=undertow/server=default-server/http-listener=remoting:add(socket-binding=remoting)
> :reload
> /subsystem=logging/logger=org.ejbca:add
> /subsystem=logging/logger=org.ejbca:write-attribute(name=level, value=DEBUG)
> /subsystem=logging/logger=org.cesecore:add
> /subsystem=logging/logger=org.cesecore:write-attribute(name=level, value=DEBUG)

Déploiement et configuration d’EJBCA

On commence par télécharger, copier et extraire EJBCA dans /opt. Je prends beaucoup de précautions avec le chown wildfly: pour m’assurer de ne pas avoir de problèmes droits.

cd /tmp
wget https://sourceforge.net/projects/ejbca/files/ejbca6/ejbca_6_10_0/ejbca_ce_6_10_1_2.zip
sudo cp /tmp/ejbca_ce_6_1_0_1_2.zip /opt/
sudo unzip ejbca_ce_6_1_0_1_2.zip

Je copie et modifie les quelques fichiers de configuration à personnaliser. Puis je change le propriétaire des fichiers.

cd /opt/ejbca_ce_6_10_1_2/conf/
sudo cp database.properties.sample database.properties
sudo cp cesecore.properties.sample cesecore.properties
sudo cp ejbca.properties.sample ejbca.properties
sudo cp install.properties.sample install.properties
sudo cp web.properties.sample web.properties
cd /opt
sudo chown -R wildfly: ejbca_ce_6_10_1_2

Dans les fichiers à personnaliser voici quelques infos:

  • database.properties: contient les informations relatives à la connexion avec la base de données. Ces informations doivent donc être identiques avec celles rentrées plus haut.
  • cesecore.properties: contient quelques paramètres de sécurité généraux.
  • ejbca.properties: contient notamment le chemin d’accès au serveur d’application (le wildfly installé plus haut).
  • install.properties: Contient les informations servant à la génération de la PKI administrative et du certificat de l’utilisateur « SuperAdmin ».
  • web.properties: Contient les informations servant à générer le certificat du serveur Web.

Il faut maintenant construire et déployer EJBCA via les commandes suivantes:

cd /opt/ejbca_ce_6_10_1_2
sudo -u wildfly ant clean deployear

Il faut ensuite exécuter l’installeur pour générer et déployer la CA administrative ainsi que les keystores nécessaires à l’exécution de l’application.

sudo -u wildfly ant runinstall
sudo -u wildfly ant deploy-keystore

Il faut ensuite supprimer les configurations existantes HTTP et HTTPS.

cd /opt/wildfly/bin
./jboss-cli.sh -c
> /subsystem=undertow/server=default-server/http-listener=default:remove
> /subsystem=undertow/server=default-server/https-listener=https:remove
> /socket-binding-group=standard-sockets/socket-binding=http:remove
> /socket-binding-group=standard-sockets/socket-binding=https:remove
> :reload

Puis on les refais proprement. Dans mon exemple, je bind les adresses 0.0.0.0 ce qui correspond à l’ensemble des adresses existantes sur le serveur.

cd /opt/wildfly/bin
./jboss-cli.sh -c
> /interface=http:add(inet-address="0.0.0.0")
> /interface=httpspub:add(inet-address="0.0.0.0")
> /interface=httpspriv:add(inet-address="0.0.0.0")
> /socket-binding-group=standard-sockets/socket-binding=http:add(port="8080",interface="http")
> /subsystem=undertow/server=default-server/http-listener=http:add(socket-binding=http)
> /subsystem=undertow/server=default-server/http-listener=http:write-attribute(name=redirect-socket, value="httpspriv")
> :reload

On identifie maintenant au serveur le keystore à utiliser ainsi que l’alias correspondant logiquement au serveur Web.

cd /opt/wildfly/bin
./jboss-cli.sh -c
> /core-service=management/security-realm=SSLRealm:add()
> /core-service=management/security-realm=SSLRealm/server-identity=ssl:add(keystore-path="${jboss.server.config.dir}/keystore/keystore.jks", keystore-password="serverpwd", alias="fqdn.toto.com")
> /core-service=management/security-realm=SSLRealm/authentication=truststore:add(keystore-path="${jboss.server.config.dir}/keystore/truststore.jks", keystore-password="changeit")
> /socket-binding-group=standard-sockets/socket-binding=httpspriv:add(port="8443",interface="httpspriv")
> /socket-binding-group=standard-sockets/socket-binding=httpspub:add(port="8442", interface="httpspub")

Il est ensuite nécessaire de redémarrer complètement le serveur applicatif.

sudo systemctl restart wildfly

Il faut ensuite procéder à quelques réglages de la pile HTTP/S.

cd /opt/wildfly/bin
./jboss-cli.sh -c
> /subsystem=undertow/server=default-server/https-listener=httpspriv:add(socket-binding=httpspriv, security-realm="SSLRealm", verify-client=REQUIRED)
> /subsystem=undertow/server=default-server/https-listener=httpspriv:write-attribute(name=max-parameters, value="2048")
> /subsystem=undertow/server=default-server/https-listener=httpspub:add(socket-binding=httpspub, security-realm="SSLRealm")
> /subsystem=undertow/server=default-server/https-listener=httpspub:write-attribute(name=max-parameters, value="2048")
> :reload

Il est enfin nécessaire procéder à quelques derniers parametrages du serveur wildfly.

cd /opt/wildfly/bin
./jboss-cli.sh -c
> /system-property=org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH:add(value=true)
> /system-property=org.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH:add(value=true)
> /system-property=org.apache.catalina.connector.URI_ENCODING:add(value="UTF-8")
> /system-property=org.apache.catalina.connector.USE_BODY_ENCODING_FOR_QUERY_STRING:add(value=true)
> /subsystem=webservices:write-attribute(name=wsdl-host, value=jbossws.undefined.host)
> /subsystem=webservices:write-attribute(name=modify-wsdl-address, value=true)
> :reload

EJBCA est maintenant prêt pour utilisation. Il faut tout d’abord importer le p12 incluant le certificat utilisateur du SuperAdministrateur dans votre magasin de certificats et également truster la CA de management.

L’administration se passe ici: https://fqdn.toto.com:8443/ejbca/adminweb/

La RA en Web se passe ici: https://fqdn.toto.com:8443/ejbca/ra/

La page public se trouve ici: https://fqdn.toto.com:8443/ejbca/

Sources

Mes sources sont les suivantes:

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *