Mise en place d’une infrastructure PKI

 

A l'heure du web 2.0, de plus en plus d'applications sont des applications web, ERP, CRM, gestion de comptes bancaires, d'agenda, etc ... On envoi à ces applications des informations confidentielles, et on aimerait pas que n'importe qui puisse récupérer ces informations et les réutiliser à des fins malhonnêtes.C'est pourquoi il est important de sécuriser l'envoi de données vers ces serveurs. On va donc utiliser TLS (remplaçant de SSL) pour sécuriser et crypter nos communications avec des certificats. Il existe plusieurs manières d'avoir des certificats

  1. soit on les achète auprès d'une autorité de certification reconnue :
    http://www.gandi.net/ssl/

    http://www.ovh.com/fr/produits/ssl.xml
    http://www.verisign.com/
  2. soit on se crée une autorité de certification qui va nous permettre de signer tout les certificats pour tout nos sites

Nous allons étudier ici le cas 2.

Pour plus d'informations sur le fonctionnement de SSL, je vous conseil ce document : http://httpd.apache.org/docs/trunk/fr/ssl/ssl_intro.html

 

Création de l'autorité de certification racine

Source Wikipédia : " En cryptographie, l'Autorité de certification (AC ou CA) a pour mission, après vérification de l'identité du demandeur du certificat par une autorité d'enregistrement, de signer, émettre et maintenir

  • les certificats (CSR : Certificate Signing Request)
  • les listes de révocation (CRL : Certificate Revocation List)"

Voir la suite. Pour commencer il faut installer le paquet openssl :

# apt-get install openssl

Dans l'optique de générer des certificats pour différents clients, je crée un répertoire par client, chaque répertoire contiendra les certificats, les clés et une conf d'openssl :

# mkdir /etc/ssl/PKI_client1
# cp /etc/ssl/openssl.conf /etc/ssl/PKI_client1

On va modifier un certain nombre de variable dans le fichier /etc/ssl/PKI_client1/openssl.conf :

HOME                    = /etc/ssl/PKI_client1
dir             = /etc/ssl/PKI_client1

Quelques paramètres par défaut pour ne pas avoir à les entrer à chaque fois :

countryName_default             = FR
stateOrProvinceName_default     = votre_region
localityName_default            = une _ville
0.organizationName_default      = le_nom_du_client
organizationalUnitName_default  = une_sous_section_de_l_entreprise

Le commonName devra correspondre au FQDN du serveur, on le précise avec ceci :

commonName                      = Common Name (FQDN of the server)
emailAddress_default            = sysadmin@domaine.com (l'adresse email d'un administrateur/webmaster)

On reviendra sur ce fichier plus tard pour rajouter des informations pour chaque serveur géré pour le client. On génère maintenant notre autorité de certification :

# export OPENSSL_CONF=/etc/ssl/PKI_client1/openssl.conf
# cd /etc/ssl/PKI_client1
# /usr/lib/ssl/misc/CA.pl -newca

Quand on vous demande : Enter PEM pass phrase: il va falloir donner un mot de passe très fort, par exemple un mot de passe de 50 caractères avec des caractères alphanumériques, et des caractères spéciaux. J'utilise apg pour les générer :

# apg -MNSC -m 50

Le plus compliqué ensuite est de garder ce mot de passe quelque part et de le sécuriser (cryptage du fichier par gpg par exemple).

Validez les informations sauf pour le "Common Name" qui pour le moment devrait être par exemple le nom du client, ce serra le FQDN quand on génèrera des certificats pour les serveurs.

Ne pas entrer de "challenge password".

Si tout se passe bien vous devriez avoir un message qui ressemble à ceci :

Certificate is to be certified until Jan 12 21:00:42 2013 GMT (1095 days) Write out database with 1 new entries Data Base Updated

 

Créer un certificat

Création de la clé

Nous commençons par créer la clé privée pour le serveur. J'ai l'habitude de nommer la clé par rapport au nom du serveur, par exemple serveur.domaine.tld :

# openssl genrsa -des3 -rand /dev/urandom -out serveur.domaine.tld.key 4096

On génère un mot de passe assez fort pour cette clé, par exemple 25 caractères.

 

Clé au format pem

Les serveurs web demandent à ce que la clé soit au format pem, on va donc devoir générer ce fichier pem

# openssl rsa -in serveur.domaine.tld.key -out serveur.domaine.tld.key.pem

 

Création de la demande de certificat

On va générer des certificats de 5 ans :

# openssl req -new -key serveur.domaine.tld.key -out  serveur.domaine.tld.csr -days 1825

 

Paramétrage de la CA pour ce serveur

On va modifier le fichier openssl.conf pour ce serveur, on peut imaginer par exemple que sur le même serveur on aura plusieurs vhosts apache sur le même domaine, on doit donc référencer les DNS de chaque serveur :

[ serveur.domaine.tld_server_cert ]
basicConstraints = critical, CA:FALSE
subjectKeyIdentifier = hash
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth, clientAuth
nsCertType = server
nsComment = "Certificat Serveur serveur"
subjectAltName = DNS:vhost01.domaine.tld,DNS:vhost02.domaine.tld

 

Génération du certificat et signature par la CA

# openssl ca -in serveur.domaine.tld.csr -extensions serveur.domaine.tld_server_cert 
-out serveur.domaine.tld.crt

 

Lire le certificat

# openssl x509 -in  serveur.domaine.tld.crt -text -noout | more

 

Protéger le répertoire

# find ./PKI_client1/ -type d -exec chmod 700 {} ;
# find ./PKI_client1/ -type f -exec chmod 600 {} ;

 

Mettre à dispo les certificats dans le cas d'un serveur web

On crée un répertoire web :

# mkdir /etc/ssl/web
# cp /etc/ssl/PKI_client1/serveur.domaine.tld.crt /etc/ssl/web
# cp /etc/ssl/PKI_client1/serveur.domaine.tld.key.pem /etc/ssl/web

 

Révoquer un certificat

# openssl ca -revoke serveur.domaine.tld.crt

 

Rajouter des DNS

a/ révoquer le certificat

b/ aller dans le répertoire et exporter le fichier de conf

# export OPENSSL_CONF=/etc/ssl/PKI_client1/openssl.conf

c/ modifier dans openssl.conf la partie concernant ce serveur [ *_server_cert ] d/ resigner par la CA le certificat

 

Diffuser la chaine de certification

Pour Firefox

Récupérer le fichier cacert.pem.
Aller dans "Edition/Préférences/Avancé/Chiffrement".
Cliquer sur "Afficher les certificats".
Cliquer sur l'onglet "Autorités".
Faire "Importer" et choisir le fichier cacert.pem récupéré.
Choisir "Confirmer cet AC pour identifier les sites Web" et valider.

# export OPENSSL_CONF=/etc/ssl/CA_NMD/openssl.cnf
# cd /etc/ssl/CA_NMD
# /usr/lib/ssl/misc/CA.pl -newca
# export OPENSSL_CONF=/etc/ssl/CA_NMD/openssl.cnf
# cd /etc/ssl/CA_NMD
# /usr/lib/ssl/misc/CA.pl -newca