TP de mise en oeuvre d’une PKI avec Openssl
But du TP Créer une infrastrucure à clefs publiques (PKI) permettant de générer des certificats serveur et client Nous allons de plus créer une autorité fille intermédiaire qui signera tout les certificats et pourra être remplacé si un pirate vole sa clef privée, car l’autorité racine sera, elle, en sureté.
Schéma On commence par créer un certificat racine On créé ensuite une CA Root Clef pub: 00110100 11001100 01110101 On commence par créer un certificat racine On créé ensuite une autorité fille Signée par la CA Autosigné CA Root CAssl Clef pub: 00110100 10100100 01110101 CA Root
Schéma On créé ensuite une demande CA Root Clef pub: 00110100 11001100 01110101 On créé ensuite une demande certificat serveur On refait les mêmes opérations pour le certificat client Que l’on va signer avec l’autorité fille CA Root CAssl Clef pub: 00110100 10100100 01110101 Cert Server Clef pub: 00110100 10100100 01110101 Cert Client Clef pub: 00110100 10100100 01110101 CA Root CAssl CAssl
Création du fichier openssl.cnf Sur le site: http://www.hsc.fr/ressources/breves/ssl_configuration.html.fr Aller dans les annexes et copier le contenu du fichier openssl.cnf Coller ce contenu dans un fichier openssl.cnf que vous pouvez créer n’importe où Vous pouvez changer les valeurs de [ req_distinguished_name ] dans ce fichier
Création des répertoires Créez un répertoire pour votre PKI, par exemple: # mkdir /tp_pki Copiez openssl.cnf dans ce répertoire Allez dans ce répertoire
Création des répertoires (2) Créez les répertoires et fichiers nécessaires au bon fonctionnement On crée les fichiers et répertoires nécessaires : $ mkdir -p ca/newcerts # Répertoire recueillant les certificats # émis par CA ROOT $ touch ca/index.txt # Base de données des certificats émis $ echo '01' > ca/serial # Numéro de série, initialisé à 1. # Incrémenté par la suite $ mkdir -p cassl/newcerts #idem, pour CA SSL $ touch cassl/index.txt $ echo '01' > cassl/serial
Création du certificat CA On crée un couple de clefs (publique/privée) $ openssl genrsa -out ca/ca.key -des3 2048 On crée ensuite un certificat qui va être signé (validé) par lui-même, car il est le certificat racine # openssl req -new -x509 -key ca/ca.key -out ca/ca.pem -config ./openssl.cnf -extensions CA_ROOT Vous devriez donc avoir ce certificat autosigné dans le répertoire ca, nommé ca.pem
Vérification du certificat CA Le certificat est au format .pem et n’est donc pas directement lisible sous unix. Pour cela, il y a une commande openssl : $ openssl x509 -in ca/ca.pem -text -noout
Création du certificat CAssl (fille) On crée un couple de clefs (publique/privée) $ openssl genrsa -out cassl/cassl.key -des3 2048 On crée ensuite un certificat non signé (.crs certificate signing request) ATTENTION de bien utiliser les mêmes valeurs de pays, ville, etc. Seuls les name et email changent # openssl req -new -key cassl/cassl.key -out cassl/cassl.crs -config ./openssl.cnf Et on le signe avec la clef privée de l’autorité, la CA. # openssl ca -out cassl/cassl.pem -config ./openssl.cnf -extensions CA_SSL -infiles cassl/cassl.crs
Création du certificat CAssl (fille) Il en ressort un beau certificat signé cassl.pem a vérifier !!! $ openssl x509 -in cassl/cassl.pem -text -noout Le fichier cassl.pem a été créé car on l’a explicitement demandé -out cassl/cassl.pem Sinon, un fichier identique a été créé dans ca/newcerts/01.pem
Création du certificat serveur On crée un couple de clefs (publique/privée) # openssl genrsa -out cassl/serverssl.key -des3 1024 On crée ensuite un certificat non signé # openssl req -new -key cassl/serverssl.key -out cassl/serverssl.crs -config ./openssl.cnf Que l’on signe avec l’autorité fille (cassl.pem) # openssl ca -out cassl/serverssl.pem -name CA_ssl_default -config ./openssl.cnf -extensions SERVER_RSA_SSL -infiles cassl/serverssl.crs Attention, j’ai ajouté ici -out cassl/serverssl.pem pour créer explicitement le certificat serverssl.pem qui est en fait une copie de cassl/newcerts/01.pem
Création du certificat client On crée un couple de clefs (publique/privée) # openssl genrsa -out cassl/serverssl.key -des3 1024 On refait les même commandes que pour le certificat serveur, en remplaçant par “client” # openssl req -new -key cassl/clientssl.key -out cassl/clientssl.crs -config ./openssl.cnf # openssl ca -out cassl/clientssl.pem -name CA_ssl_default -config ./openssl.cnf -extensions CLIENT_RSA_SSL -infiles cassl/clientssl.crs
Exportation du certificat client On transforme le .pem en .p12 qui est un format exécutable sous windows ou linux pour mettre en place facilement le certificat $ openssl pkcs12 -export -inkey cassl/clientssl.key -in cassl/clientssl.pem -out clientssl.p12 -name "Certificat client" Et hop ! vous pouvez maintenant en créer autant que vous voulez en réitérant cette démarche, avec les bonnes options Vous pouvez aussi créer un script qui automatise toute cette démarche