Suite à la mise en place d'une PKI Open Source dans le cadre de mon travail, j'ai cru bon de partager cet article qui présente la mise en place d'EJBCA dans un environnement Linux (Debian).
Il faut adapter à votre contexte.
Pour des raisons de sécurité, et conformément aux bests-practices, l'autorité de certification principale (appelée Root CA) et les autorités de certifications secondaires (appelée Sub CA) ne sont pas hebergées sur les mêmes machines.
L'autorité de certification Root est déployée sur la VM root-ca.coom.lan tandis que les Subs Ca sont déployées sur la VM sub-ca.coom.lan
Les autorités de certifications disposent de leur propre interface utilisateur en Web, accessible respectivement via les URLs suivantes :
Root CA : https://root-ca.coom.lan:8442/ejbca/
Subs CA : https://root-ca.coom.lan:8442/ejbca/
Cette section décrit l'installation et la configuration d'EJBCA sur une distribution Debian Linux.
La procédure a été testée sur la derniere version de Debian (9.3 au moment de la rédaction de ce guide).
Pour fonctionner correctement EJBCA à besoin de certains pré-requis. Cette section explique comment les installer.
Pour des raisons de sécurité, il est fortement recommandé de lancer l'ensemble des applicatifs sous une identité user (et pas root!).
A ce titre, on créer un user, on lui affecte un mot de passe fort:
useradd pki
passwd pki
Nous allons déployer notre PKI et ses sous-systèmes au sein du répertoire /opt nous changeons donc le HOMEDIR du nouvel user, ainsi que son shell :
usermod -d /opt pki
chown -R pki: /opt
chmod 700 -R /opt
chsh -s /bin/bash pki
On commence par mettre à jour l'ensemble du système :
apt update && apt upgrade -y
On installe le package **openjdk-8-jdk
apt install -y openjdk-8-jdk
On installe les packages curl, mariadb-server, openjdk-8-jdk, ant, ant-optional, psmisc, mariadb-client, bc, patch et unzip
apt install -y curl mariadb-server ant ant-optional psmisc mariadb-client bc patch unzip
On sécurise mariadb-server :
mysql_secure_installation
Répondre Y à l'ensemble des questions.
Pour fonctionner, EJBCA à besoin d'une base de donnée MySQL (MariaDB). On créer donc un utilisateur, ainsi qu'une base de données, sur laquelle on donne tout les droits.
Pour cela, on se connecte en root :
mysql -u root -p
Puis :
CREATE DATABASE ejbca CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON ejbca.* TO 'ejbca'@'localhost' IDENTIFIED BY 'mon-password';
FLUSH PRIVILEGES;
exit
On remplace bien evidemment mon-password par le mot de passe souhaité.
L'ensemble des actions ci-dessous doit être effectuée sous l'identité de l'utilisateur précédemment créée, dans notre cas, pki :
su - pki
On commence par télécharger le paquet, et on le dézip :
cd /opt
wget https://freefr.dl.sourceforge.net/project/ejbca/ejbca6/ejbca_6_15_2_5/ejbca_ce_6_15_2_5.zip
unzip ejbca_ce_6_15_2_5.zip
Pour plus de clarté, on renomme le dossier par défaut :
mv ejbca_ce_6_15_2_5 ejbca
On edite le fichier /opt/ejbca/extra/ejbca-setup.sh :
vim /opt/ejbca/bin/extra/ejbca-setup.sh
On modifie les paramètres suivants :
# Nom d'hote HTTP/HTTPs du service :
httpsserver_hostname="root-ca.coom.lan"
# Nom d'hote de la base de donnée (MySQL/MariaDB)
database_host="localhost"
# Nom de la base de donnée
database_name="ejbca"
# Driver mariadb pour tomcat. NE PAS MODIFIER
database_driver="org.mariadb.jdbc.Driver"
# Adresse de la base de donnée. NE PAS MODIFIER
database_url="jdbc:mysql://${database_host}:3306/${database_name}?characterEncoding=UTF-8"
# Nom d'utilisateur MySQL/MariaDB
database_username="ejbca"
# Mot de passe de la base de données :
database_password="MySuper!P@$$w0rd"
# Le distinguished Name de la future PKI :
BASE_DN="O=I-Tracing CA,C=FR"
Une fois les modifications effectuées et le fichier sauvegardé, on se place dans le repertoire /opt et on execute le script :
cd /opt
ejbca/bin/extra/ejbca-setup.sh
L'installation commence, il faut répondre "yes" en tapant 1 au 3 questions posées :
####### # ###### ##### #
# # # # # # # #
# # # # # # #
##### # ###### # # #
# # # # # # #######
# # # # # # # # #
####### ##### ###### ##### # #
This installs the EJBCA PKI
found Debian/Ubuntu
EJBCA will be installed as OS user 'pki'
please install dependencies with:
apt install unzip openjdk-8-jdk-headless ant ant-optional psmisc mariadb-client bc patch
Please select "Yes" if you did so, but not before
1) Yes
2) No
#? 1
This will destroy your complete EJBCA installation in database ejbca
This will also 'kill -9' all your currently running java processes.
Do you want this?
1) Yes
2) No
#? 1
LAST CHANCE TO STOP THIS
Do you really want to destroy your EJBCA installation in database ejbca?
1) Yes
2) No
#? 1
Si toutes les opérations précédentes ce sont bien déroulées, vous devriez obtenir le message suivant à la fin de l'installation :
********************************
* SUCCESS *
********************************
You can now install the superadmin.p12 keystore, from /opt/ejbca/p12, in your web browser, using the password **5c4df18faec7800f2e435962f4d64855bb5cd771**, and access EJBCA at https://localhost:8443/ejbca
Le reste de la configuration s'effectue via la WebUI, dans l'URL qui va été communiqué via le script d'installation et de configuration.
Pour vous connecter à l'interface d'administration, vous avez besoin du certificat "SuperAdmin" généré lors de l'installation. Pour cela, on récupère (via SFTP/SCP) le fichier /opt/ejbca/p12/superadmin.p12.
Il est recommandé, pour des raisons de sécurité, de supprimer le fichier superadmin.p12 une fois celui-ci récupéré et stocké dans un endroit sûr.
Vous devez importer ce certificat au sein de votre store Windows et fermer/réouvrir l'ensemble de nos navigateurs pour prise en compte de ce dernier.
Firefox ne s'appuyant pas sur le store de Windows, il vous faudra ajouter le certificat SuperAdmin.p12 au sein de Firefox. Pour cela, on va dans les paramètres, puis Avancé, on selectionne l'onglet **Certificats', puis Afficher les certificats.
On se rend alors dans l'onglet Vos certificats et on clique sur Importer.
Le mot de passe qui protège la clé privée est celui qui s'est affiché à la fin de l'execution du script.
Pour generer un certificat, il faut créer une entité, puis generer le certificat pour cette entité, et le télécharger. Ces etapes sont décrites au sein des chapitres suivants.
On se connecte à l'interface web d'administration : https://sub-ca.coom.lan:8443/ejbca/adminweb/
On clique, à gauche, sur 'Add End Entity'
On remplit comme suit :
Type de certificat généré (Token)
Dans la liste déroulante, il faut choisir entre différents types de certificats.
User Generated: A selectionner si le Certificat sera généré à la suite d'un CSR (Certificate Signing Request). La PKI selectionnera alors le type en fonction de la requete CSR.
P12: Fichier PKCS#12 contenant le certificat, et la clé privée, protégée par un mot de passe.
JKS: Format propriétaire Java, utilisé notamment dans le cadre de Tomcat.
PEM: Fichier contenant le certificat ainsi que la clé privée, le tout encodé en Base64. La plupart des serveurs Web (Apache, nginx, etc..) exigent ce type de format.
Une fois l'entité ajoutée, le reste des opérations se passe dans l'interface utilisateur, accessible ici : https://sub-ca.coom.lan:8442/ejbca/
Pour signer un certificat issue d'un CSR, une fois dans l'interface Utilisateur, cliquez sur Create Certificate from CSR dans le menu de gauche.
On remplit comme suit :
Et on valide en cliquant sur OK
Un nouvel écran récapitule les informations renseignées au sein du CSR. Le navigateur Web doit alors télécharger automatiquement le certificat généré. Si ca n'est pas le cas, cliquez sur Download certificate
''En fonction de la longueur de la clé, la page peut mettre plusieurs secondes a se charger. Ce délai correspond au temps nécessaire à la PKI pour générer un certificat.''
Une fois l'entité ajoutée, le reste des opérations se passe dans l'interface utilisateur, accessible ici : https://sub-ca.coom.lan:8442/ejbca/
On clique sur "Create Keystore" à gauche, et on remplit le formulaire avec les informations concernant l'entité précédemment créée.
Username : Nom de l'entité créée précédemment
Password : Mot de passe de l'entité créée précédemment.
On valide en cliquant sur OK
L'ecran suivant vous permet de choisir la taille de la clé privée qui sera générée. On choisit la valeur souhaitée, et on clique sur Enroll
Le certificat est alors automatiquement téléchargé par le navigateur.
Si le message suivant apparait :
Wrong user status! To generate a certificate for a user the user must have status New, Failed or In process.
C'est que l'entité qui a été spécifiée s'est déja vu offrir un Certificat. Il est possible de récupérer le certificat précédémment délivré à l'entité. Voir la rubrique "Gestion des entités" (En cours de rédaction)
Si votre Certificat Super Admin a expiré, connectez vous en SSH puis rendez vous dans le dossier ejbca :
su - pki
cd /opt/ejbca
Puis :
bin/ejbca.sh ra setendentitystatus superadmin 10
bin/ejbca.sh ra setclearpwd superadmin password
bin/ejbca.sh batch
Un nouveau fichier p12 est généré dans le dossier /opt/ejbca/p12 (superadmin.p12)
Récuperez ce fichier et injectez le à l'aide du mot de passe défini plus haut (Dans notre cas il sagit de password
)
Cette section décrit la mise à jour de la PKI tout en preservant les données stockées au sein de celle-ci. Ne faites pas cette procédure sans snapshot et/ou backup de votre PKI interne !
On commence par télécharger la derniere version de l'applicatif et on le place dans /opt puis on dézip :
unzip ejbca_latest.zip
Cette partie est importante si vous souhaitez automatiser certaines taches via email (Alerting sur les certificats expirés, génération de certificat avec envoi de mail à l'utilisateur, etc..)
Dans un CLI Jboss on renseigne les infos via ces 3 lignes de config :
/socket-binding-group=standard-sockets/remote-destination-outbound-socket-binding=ejbca-mail-smtp:add(port="25", host="mail.domain.tld")
/subsystem=mail/mail-session="java:/EjbcaMail":add(jndi-name=java:/EjbcaMail, from=pki@domain.tld)
/subsystem=mail/mail-session="java:/EjbcaMail"/server=smtp:add(outbound-socket-binding-ref=ejbca-mail-smtp, tls=false)