Comment installer et configurer une autorité de certification (CA) sur Docker
Introduction
Qu’est-ce qu’une PKI ?
Une PKI (Infrastructure à Clés Publiques) est un ensemble de protocoles, de politiques et de procédures qui permettent de gérer les clés de chiffrement et de certificats numériques pour assurer l’authentification, la confidentialité et l’intégrité des communications électroniques. La PKI repose sur une structure en arborescence, avec une Autorité de Certification Racine (AC Racine) et des Autorités de Certification Intermédiaires (AC Inter). Les AC Racine et Inter délivrent des certificats aux entités (serveurs, clients) afin de valider leur identité.
Easy-RSA
Easy-RSA est un ensemble de scripts qui facilite la création et la gestion d’une PKI. Il est souvent utilisé avec OpenVPN pour générer des certificats pour les serveurs et les clients. Dans cet article, nous allons expliquer étape par étape comment configurer une PKI avec Easy-RSA.
Mise en place du Lab
Pour tester les différents aspects de la mise en oeuvre de la PKI, nous allons mettre en place une infrastructure via docker et un fichier docker-compose
Un des container servira de Root CA, le deuxième de CA Intermédiaire(SubCA) et le troisième de client.
En pratique, le serveur root CA ne servira qu’a créer les certificats pour les SubCA et doit être mit hors ligne pour des raisons de sécurités. Toute compromition de ce serveur mettrait en péril toute l’infrastructure basée sur les certificats émis par les SubCA s’y rattachant.
Dans tout le reste de ce guide:
Les termes de Root CA, CA Primaire, CA Principale désignent tous la même fonctionnalité. L’authorité de certification principale.
Le terme de SubCA désignera l’AC Intermédiaire
Les termes de client, serveur, désignent tous la même fonctionnalité, un certificat qui sera émis à partir de la SubCA
L’idée est d’utiliser l’image dockeropenssh-server de linuxio et de la modifier pour y ajouter la partie easyrsa
Arborescence du projet.
# tree -d -L 3.
|-- docker-openssh-server # Répertoire du clone GitHub de linuxio|`-- root
|-- server_CA # Répertoire du server Root CA||-- PKI
|`-- ssh_config
|-- server_subCA # Répertoire du serveur CA Intermédiaire (SubCA)||-- PKI
|`-- ssh_config
`-- server3 # Répertoire d'un client|-- PKI
`-- ssh_config
Nous allons ensuite avoir besoin du créer notre image Docker de base. Comme décrit plus haut, nous partons de celle de Linuxio
On va cloner le dépot docker-openssh-server dans notre répertoire LAB:
On créé ensuite l’image qui sera la base de notre LAB. il est possible de lui donner le nom que l’on veux à condition de le répercuter dans tous les fichiers de configuration.
# docker-compose up -d[+] Running 4/4
✔ Network pki_int_h1 Created 0.1s
✔ Container server_3 Started 2.4s
✔ Container server_SubCA Started 1.2s
✔ Container server_CA Started 1.4s
On peux contrôler le bon fonctionnement de notre petite infrastructure.
# docker-compose psNAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
server_3 breizhland/easy-rsa:latest "/init" server_3 9 minutes ago Up 9 minutes
server_CA breizhland/easy-rsa:latest "/init" server_CA 9 minutes ago Up 9 minutes
server_SubCA breizhland/easy-rsa:latest "/init" server_SubCA 9 minutes ago Up 9 minutes
Configuration de l’Autorité de Certification Principale (Root CA)
Étape 1 : Initialisation de la PKI sur l’AC Principale
Afin de lancer les commandes de création dans les containers, je vais créer un ou plusieurs alias comme ci-dessous.
On peut ensuite lancer la création de la paire de clefs pour la CA
# easyrsa_CA init-pki
Sortie de la commande
Notice
------
'init-pki' complete; you may now create a CA or requests.
Your newly created PKI dir is:
* /data/pki
* Using Easy-RSA configuration:
* IMPORTANT: Easy-RSA 'vars' template file has been created in your new PKI.
Edit this 'vars' file to customise the settings for your PKI.
To use a global vars file, use global option --vars=<YOUR_VARS>
* Using x509-types directory: /usr/share/easy-rsa/x509-types
On peut facilement contrôler le résultat de la commande en vérifiant le contenu du répertoire qui est monté dans le container server_CA.
La structure de répertoire suivante est créé:
# LAB/PKI_docker_install/server_CA/PKI # ll pkitotal 40-rw------- 1 root root 5043 Aug 3 00:55 openssl-easyrsa.cnf
drwx------ 2 root root 4096 Aug 3 00:55 private
drwx------ 2 root root 4096 Aug 3 00:55 reqs
-rw------- 1 root root 9014 Aug 3 00:55 vars
-rw------- 1 root root 9014 Aug 3 00:55 vars.example
On va éditer le fichier server_CA/PKI/pki/vars et enlever les # en renseingant les lignes suivantes:
Pour la partie Organisation
A noter que si cette partie ne vous intéresse pas plus que ça, il est possible de désactiver son utilisation en positionnant le paramêtre suivant:
# Choices are:# cn_only - Use just a commonName value.# org - Use the "traditional" format:# Country/Province/City/Org/Org.Unit/email/commonName#set_var EASYRSA_DN "cn_only"
Autrement:
set_var EASYRSA_DN "org"# Set to "org" to activate following information requestset_var EASYRSA_REQ_COUNTRY "FR"set_var EASYRSA_REQ_PROVINCE "Bretagne"set_var EASYRSA_REQ_CITY "Lorient"set_var EASYRSA_REQ_ORG "Breizhland"set_var EASYRSA_REQ_EMAIL "security@breizhland.eu"set_var EASYRSA_REQ_OU "breizhland inc."
Pour la partie configuration:
set_var EASYRSA_PKI "$PWD/pki"set_var EASYRSA_CA_EXPIRE 730# délai de validité de la CA (Par défaut 3650)set_var EASYRSA_CERT_EXPIRE 365# délai de validité des certificats (Par défaut 825)set_var EASYRSA_CRL_DAYS 30# délai entre deux publication de la CRL (Par défaut 180)set_var EASYRSA_CERT_RENEW 30# délai de vérification de l'expiration d'un certificat.
Étape 2 : Génération de la paire de clés pour l’AC Principale
Maintenant, nous allons générer une paire de clés pour notre AC Racine.
# easyrsa_CA build-ca nopass
Au cours du processus de création, le nom de votre autorité de certification vous sera demandé, c’est le nom commun(CN)(Common Name).
Ce nom est purement à des fins d’affichage et peut être défini comme vous le souhaitez.
Sortie de la commande
* Using SSL: openssl OpenSSL 3.1.1 30 May 2023(Library: OpenSSL 3.1.1 30 May 2023)* Using Easy-RSA configuration: /data/pki/vars
Using configuration from /data/pki/57178dfd/temp.83a74087
....+++++++++++++++++++++++++++++++++++++++*...................+.+.....+....+...+..+.+.....+++++++++++++++++++++++++++++++++++++++*.....+..........+.........+......+...........+...++++++
.......+...+.........+.....+...+.........+....+..........................+..........+++++++++++++++++++++++++++++++++++++++*....+...+++++++++++++++++++++++++++++++++++++++*..............+..+......+.............+..+............+.+.....+.......+...+.....+.+......+...+......+.....+.+........+.+.....+....+.....+..........+..+.........+...+......+.......+..+...+....+...+.................+.+...+.........+...............+...+........+............+............+.++++++
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name)[Easy-RSA CA]:breizhland CA
Notice
------
CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/data/pki/ca.crt
Configuration de l’Autorité de Certification Intermédiaire (SubCA)
Étape 3 : Initialisation de la PKI pour la SubCA
# easyrsa_subCA init-pki
Sortie de la commande
Notice
------
'init-pki' complete; you may now create a CA or requests.
Your newly created PKI dir is:
* /data/pki
* Using Easy-RSA configuration:
* IMPORTANT: Easy-RSA 'vars' template file has been created in your new PKI.
Edit this 'vars' file to customise the settings for your PKI.
To use a global vars file, use global option --vars=<YOUR_VARS>
* Using x509-types directory: /usr/share/easy-rsa/x509-types
Étape 4 : Création de la demande de certificat pour la SubCA
* Using SSL: openssl OpenSSL 3.1.1 30 May 2023(Library: OpenSSL 3.1.1 30 May 2023)* Using Easy-RSA configuration: /data/pki/vars
Using configuration from /data/pki/d40458b4/temp.e7f06630
.............+.....+.+..+...+.........+.+............+..+...+.......+........+.......+++++++++++++++++++++++++++++++++++++++*....+.+......+..+...+.........+.+..+............+....+.....+....+..+......+....+.....+..........+...........+...+....+......+.....+......+...+.+.....+....+..+..........+...+..+.+.....+.........+.+.........+...+......+..+....+..................+...+..+.......+.....+...+..........+..+.+..+...+...+++++++++++++++++++++++++++++++++++++++*..+...+...+.........+.....+......+....+.....+.............+...........+.......+..+...+...............+............+.++++++
......+...+..+...+...............+.+.....+++++++++++++++++++++++++++++++++++++++*.+......+......+.......+......+......+.....+......+....+...+...+..+.+..+...+....+...+...............+...+.....+....+.....+.............+.....+.............+.........+..+....+.....+.+++++++++++++++++++++++++++++++++++++++*...+...............++++++
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name)[Easy-RSA Sub-CA]:breizhland SubCA_01
Notice
------
NOTE: Your intermediate CA request is at /data/pki/reqs/ca.req
and now must be sent to your parent CA for signing. Place your resulting cert
at /data/pki/ca.crt prior to signing operations.
Étape 5 : Import de la requête de la SubCA sur l’AC Principale
Une fois qu’une autorité de certification est créée, la PKI est destinée à être utilisée pour importer des demandes provenant de systèmes externes qui demandent un certificat signé à cette autorité de certification. Afin de signer la requête, elle doit d’abord être importée afin qu’Easy-RSA en ait connaissance. Ce fichier de demande doit être un CSR standard au format PKCS#10.
Quel que soit le nom du fichier à importer, Easy-RSA utilise un “nom court” défini lors de l’importation pour faire référence à cette requête. L’importation fonctionne comme ceci :
Le nom de la demande nameOfRequest doit normalement faire référence au système ou à la personne qui fait la demande.
On recopie le fichier request de la SubCA:
* Using SSL: openssl OpenSSL 3.1.1 30 May 2023(Library: OpenSSL 3.1.1 30 May 2023)* Using Easy-RSA configuration: /data/pki/vars
Notice
------
The request has been successfully imported with a short name of: SubCA_breizhland.eu
You may now use this name to perform signing operations on this request.
Étape 6 : Signer la demande de la SubCA avec la AC Principale.
Une fois qu’Easy-RSA a importé une demande, elle peut être examinée et signée. Chaque certificat a besoin d’un « type » qui contrôle les extensions que le certificat obtient. Easy-RSA est livré avec 3 types possibles : client, server et ca, décrits ci-dessous :
client - Un client TLS, adapté à un utilisateur VPN ou à un navigateur Web (client Web)
server - Un serveur TLS, adapté à un VPN ou à un serveur Web
ca - Une autorité de certification subordonnée, utilisée lors de l’enchaînement de plusieurs autorités de certification
easyrsa_CA sign-req ca SubCA_breizhland.eu
Sortie de la commande
* Using SSL: openssl OpenSSL 3.1.1 30 May 2023(Library: OpenSSL 3.1.1 30 May 2023)* Using Easy-RSA configuration: /data/pki/vars
You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.
Request subject, to be signed as a ca certificate for825 days:
subject=commonName= server_subca
Type the word 'yes' to continue, or any other input to abort.
Confirm request details: yes
Using configuration from /data/pki/e319cf54/temp.50ad1090
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'server_subca'Certificate is to be certified until Nov 5 09:14:21 2025 GMT (825 days)Write out database with 1 new entries
Data Base Updated
Notice
------
Certificate created at:
* /data/pki/issued/SubCA_breizhland.eu.crt
Nous avons maintenant un certificat complétement fonctionnel pour notre SubCA.
Étape 7 : Mise en place du certificat sur la SubCA
Ensuite, on copie le contenu du fichier /data/pki/issued/SubCA_breizhland.eu.crt vers le fichier pki/ca.crt de notre CA Intermédiaire, et le tour est joué !
Création de la demande de certificat sur le client.
/LAB/PKI_docker_install # easyrsa_srv init-pkiNotice
------
'init-pki' complete; you may now create a CA or requests.
Your newly created PKI dir is:
* /data/pki
* Using Easy-RSA configuration:
* IMPORTANT: Easy-RSA 'vars' template file has been created in your new PKI.
Edit this 'vars' file to customise the settings for your PKI.
To use a global vars file, use global option --vars=<YOUR_VARS>
* Using x509-types directory: /usr/share/easy-rsa/x509-types
* Using SSL: openssl OpenSSL 3.1.1 30 May 2023(Library: OpenSSL 3.1.1 30 May 2023)* Using Easy-RSA configuration: /data/pki/vars
........+.+...........+...+....+++++++++++++++++++++++++++++++++++++++*......................+..+.+..+.......+.....+...+.+............+..+...+.........+.+...+..+...+....+.....+...+..................+....+.....+................+.....+.+.....+.+..+.+......+.....+..........+...+..+....+..+.......+...+..+...............+......+..........+++++++++++++++++++++++++++++++++++++++*.+................+........+......................+...+..+...+.+.....+.+.....+..........+...+...+.....++++++
.......+++++++++++++++++++++++++++++++++++++++*...+++++++++++++++++++++++++++++++++++++++*....+.....+.+......+.....+.+..+.......+.....+...+......+.......+..+.......+......+...+.....+....+............+...+.....+...+.......+...+.........+.........+.....+.........+.+..+.......+..+.+..+......+...................+...+..+............+...+......+.+...........+.........+.+........+.......+...+..+.........+......+.........+.+...+.........+.....+...+....+........+...+...............+...+....+......+......+.....+.+.....+.......+..+......+..........+........+....+..+.+............+..+......+...+..........+............+........+.+.....+.+........+.+........+...+...............+...+....+......+...........+.........+....+.....+...+.......+...+..+...............+.+..+...+......................+........+...................+..+...+......+........................+.......+...........+............+.......+...+..+.+...............+...+..+.........+...+.+.....+.......+........+......+.+..+......+.........+..........+.....+.......+......+.....+.......+.....+.......+........+.+..+...+.+.........+.....+....+.....+.............+..+.....................+.+.....+..............................+....+......+......+.....+..........+..................+......+.....+.........+.+...+..+.........+....+.....+.......+.........+............+..+...+.........+.+...+...........+.+...............+............+......+.....+......+...+...............+..........+.....+...+...+.+...+..+...............+...+......+............+.............+..+.............+..+....+...+......+..+.......+...+...+.....+......+.+..+.+.....+.+.....+....+......+........+............+....+............+..+..........+........+....+.........+.....+......+.+.........+.....+.........+.........+...+...+.......+............+.....+.......+.....+...+...+............+.+..+...+.+.....+....+......+..............+.+.....+.+..+......+.......+...+..+.......++++++
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name)[server_3]:
Notice
------
Keypair and certificate request completed. Your files are:
req: /data/pki/reqs/server_3.req
key: /data/pki/private/server_3.key
/LAB/PKI_docker_install # easyrsa_subCA import-req /data/pki/to_imports/server3.req server_3* Using SSL: openssl OpenSSL 3.1.1 30 May 2023(Library: OpenSSL 3.1.1 30 May 2023)* Using Easy-RSA configuration: /data/pki/vars
Notice
------
The request has been successfully imported with a short name of: server_3
You may now use this name to perform signing operations on this request.
Création du certificat pour le client
/LAB/PKI_docker_install # easyrsa_subCA sign-req server server_3
Sortie de la commande
* Using SSL: openssl OpenSSL 3.1.1 30 May 2023(Library: OpenSSL 3.1.1 30 May 2023)* Using Easy-RSA configuration: /data/pki/vars
You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.
Request subject, to be signed as a server certificate for365 days:
subject=commonName= server3
Type the word 'yes' to continue, or any other input to abort.
Confirm request details: yes
Using configuration from /data/pki/5cbd46cd/temp.c8033559
480B9455887F0000:error:0700006C:configuration file routines:NCONF_get_string:no value:crypto/conf/conf_lib.c:315:group=<NULL> name=unique_subject
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'server3'Certificate is to be certified until Aug 2 18:09:54 2024 GMT (365 days)Write out database with 1 new entries
Data Base Updated
Notice
------
Certificate created at:
* /data/pki/issued/server_3.crt
Générer différents formats de clefs
PKCS12
Pour exporter au format pksc12:
Il va falloir recopier la clef du client server_3 sur le serveur SubCA pourpouvoir l’inclure dans le certificat pkcs12
* Using SSL: openssl OpenSSL 3.1.1 30 May 2023(Library: OpenSSL 3.1.1 30 May 2023)* Using Easy-RSA configuration: /data/pki/vars
Enter Export Password:
Verifying - Enter Export Password:
Notice
------
Successful export of p12 file. Your exported file is at the following
location: /data/pki/private/server_3.p12
Le certificat peut être recopié sur le server serveur_3