Mise en place d’une autorité de certification racine (Open SSL)

TP : Mise en place d’une autorité de certification racine

Pré requis :

Installer Apache (Ex EasyPHP, WAMP ou bien LAMP server)

Installer OpenSSL (si vous êtes sous Windows)

Mise en place de la CA racine :

Après installation d’OpenSSL, viellez à positionner le chemin du répertoire « bin » d’OpenSSL dans la variable $PATH (si vous êtes sous Windows).

Configuration du mini PKI

Créer un répertoire nommé «PKI » contenant deux sous-répertoires « newcerts » et  « private » et le fichier de configuration nommé « openssl.cnf ».

*******************************************************************

Le répertoire PKI contiendra les éléments suivants :

  • Le certificat (racine) de notre Autorité de Certification (CA)
  • La base de données des certificats signés
  • Les clés, requêtes et certificats que nous allons générer

Le répertoire PKI/newcerts contiendra :

  • Une copie de chaque certificat signé par le CA

Le répertoire PKI/private contiendra :

  • La clé privée de notre CA (Protégée par un mot de pass Fort)

*****************************************************************************

La prochaine étape est de créer une base de données pour référencer les certificats que nous allons signer. Placez-vous dans le répertoire PKI et tapez cette commande :

Créer un fichier serial (sans extension) et placer 01 au début du fichier.

Ensuite créer un fichier nommé « index.txt » dans ce même répertoire

Ouvrir le fichier de configuration(openssl.cnf) de votre CA et adapter à votre situation en changeant les valeurs.

Pour la génération de certificat, plusieurs paramètres sont en général demandés. Pour faciliter la tâche il est préférable d’éditer un fichier de configuration contenant les valeurs par défaut des certificats à générer.

Ce fichier est divisé en sections, qui sont lues et traitées en fonction des arguments passés sur la ligne de commande. Les sections peuvent inclure une ou plusieurs autres sections en y faisant référence, ce qui augmente la modularité du fichier de configuration. Un nom entre crochets (par exemple [req]) marque le début de chaque section.

Nous avons maintenant la section définissant la manière dont les certificats seront créés, et une section définissant le type de certificat à créer.

##########################################################

#
# OpenSSL configuration file.
#

# Establish working directory.

dir = .

[ ca ]
default_ca = CA_default

[ CA_default ]
serial = $dir/serial
database = $dir/index.txt
new_certs_dir = $dir/newcerts
certificate = $dir/cacert.pem
private_key = $dir/private/cakey.pem
default_days = 365
default_md = sha1
preserve = no
email_in_dn = no
nameopt = default_ca
certopt = default_ca
policy = policy_match

[ policy_match ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional

[ req ]
default_bits = 2048 # Size of keys
default_keyfile = client_key.pem # nom par défaut de la clé privée du demander à modifier
default_md = sha1 # message digest algorithm
string_mask = nombstr # permitted characters
distinguished_name = req_distinguished_name
req_extensions = v3_req

[ req_distinguished_name ]
# Variable name Prompt string
#---------------------- ----------------------------------
0.organizationName = Organization Name (company)
organizationalUnitName = Organizational Unit Name (department, division)
emailAddress = Email Address
emailAddress_max = 40
localityName = Locality Name (city, district)
stateOrProvinceName = State or Province Name (full name)
countryName = Country Name (2 letter code)
countryName_min = 2
countryName_max = 2
commonName = Common Name (hostname, IP, or your name)
commonName_max = 64

# Default values for the above, for consistency and less typing.
# Variable name Value
#------------------------------ ------------------------------
0.organizationName_default = DevMaster
localityName_default = Dakar
stateOrProvinceName_default = Senegal
countryName_default = SN

[ v3_ca ]
basicConstraints = CA:TRUE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer:always

[ v3_req ]
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash

##########################################################

**********************************************************************************

A chaque fois que vous utiliserez votre certificat de CA pour signer une requête, la phrase de passe vous sera demandée. Choisissez donc une phrase de passe non triviale et assurez-vous de ne pas la perdre. Exemple « 123456 » « Très Mauvais ! je le prends quand même ».

Pour créer notre certificat racine auto-signé, nous  allons pour cela fournir ces paramètres sur la ligne de commande.

Voilà le détail des paramètres que nous allons passer à la commande openssl req :

  • Créer un nouveau certificat auto-signé : -new -x509
  • Créer un certificat de CA : -extensions v3_ca
  • Allonger sa durée de validité à 10 ans : -days 3650
  • Spécifier le nom des fichiers de sortie : -keyout, -out
  • Utiliser notre fichier de configuration : -config ./openssl.cnf

Une note sur la durée de validité des certificats racine : Lorsqu’un certificat racine expire, tous les certificats signés avec ce certificat racine sont invalidés. Pour corriger celà, un nouveau certificat racine doit être créé et distribué. De plus, tous les certificats signés avec le certificat racine périmé doivent être révoqués et signés à nouveau avec le nouveau certificat racine. 

>openssl req -new -x509 -extensions v3_ca -keyout private/cakey.pem -out cacert.pem -days 3650 -config ./openssl.cnf

Ce processus crée deux fichiers de sortie:

  • Une clé privée dans private/cakey.pem
  • Un certificat de CA racine dans cacert.pem

Le fichier cacert.pem est le certificat de CA racine que vous devrez distribuer aux clients.

Question : Taper ces commandes à la console et expliquer ce qu’elles font :

  • openssl x509 -in cacert.pem -noout -text
  • openssl x509 -in cacert.pem -noout -dates
  • openssl x509 -in cacert.pem -noout –purpose

Si vous vouliez que les utilisateurs soient capables d’installer le certificat dans leur navigateur (en le téléchargeant et en l’ouvrant), vous devez créer une version codée DER du certificat :

>openssl x509 -in cacert.pem  -out cacert.der.crt -outform DER

 

Création d’une Requête de Signature de Certificat (CSR) :

Maintenant que nous disposons d’un certificat racine, nous pouvons créer autant de certificats que nous le voulons et les utiliser dans nos applications SSL telles qu’https, FTPS, POP,  VPN,…. La procédure à suivre implique de créer une clé privée et une demande de signature de certificat (Certificate Signing Request ou CSR), puis de faire signer cette demande pour générer un certificat.

Dans cet exemple, nous allons créer une requête de  certification à fournir au CA pour avoir un certificat signé  pour sécuriser le serveur Web du site  «ouzdeville.com ».

Pour cela le demandeur de signature fournit les informations suivantes dans le processus de génération:

  • Organizational Unit: Une description de ce à quoi est destiné le certificat
  • Email Address:
  • Common Name: Le nom d’hôte du serveur

Le Common Name doit être (ou l’adresse IP doit être résolue comme) le nom utilisé par vos clients pour contacter votre serveur(Taper sur les navigateurs). S’il ne correspond pas, vos clients verront à chaque fois qu’ils se connecteront un message leur demandant s’ils veulent utiliser ce serveur. En effet, le logiciel client dira :  » Vous avez tenté d’accéder à ouzdeville.com, mais le serveur a présenté un certificat émis par une entité non approuvée par le système d’exploitation de votre ordinateur.  »

Taper la commande :

>openssl req -new -nodes -out req-ouzdeville.pem -config ./openssl.cnf

Ce processus produira deux fichiers de sortie:

  • Une clé privée dans client_key.pem
  • Une CSR dans req-ouzdeville.pem

Ces fichiers doivent être conservés. Quand le certificat que vous êtes sur le point d’avoir expirera, la CSR pourra être utilisée à nouveau pour créer un nouveau certificat avec une autre date d’expiration. La clé privée est naturellement nécessaire pour le chiffrement SSL. Lorsque vous sauvegarderez ces fichiers, il sera préférable d’utiliser des noms explicites tels que  key-ouzdeville.pem et req-ouzdeville.pem.

Nous pouvons inspecter le contenu de notre requête pour nous assurer qu’elle soit correcte :

>openssl req -in req-ouzdeville.pem -text -verify –noout

 

Signer un certificat

Pour signer la CSR que nous avons créée à l’étape précédente, On n’envoie que le fichier req-ouzdeville.pem au CA pour avoir un certificat signé.

exécutez la commande suivante et répondez aux questions. Notez que la phrase de passe PEM qui vous sera demandée est celle que vous avez définie  plus haut :

>openssl ca -out cert-ouzdeville.pem -config ./openssl.cnf -infiles req-ouzdeville.pem

Celà met à jour la base de données de la CA et produit deux fichiers de sortie :

  • Un certificat dans cert-ouzdeville.pem
  • Une copie de ce certificat dans newcerts/<numéro de série>.pem

Encore une fois, vous pouvez contrôler ce certificat :

>openssl x509 -in cert-ouzdeville.pem -noout -text -purpose | more

Ce certificat contient à la fois la version encodée et une version humainement lisible dans le même fichier. Vous pouvez supprimer la version humainement lisible de la façon suivante:

>mv “(oubien move)” cert-ouzdeville.pem tmp.pem

>openssl x509 -in tmp.pem -out cert-ouzdeville.pem

Exportation Certificat:

Si vous vouliez qu’il soit possible d’installer le certificat dans les navigateurs, vous pouvez créer une version codée DER du certificat :

>openssl x509 -in cert-groupeism.pem -out cert-groupeism.der.crt -outform DER

Installation du certificat et de la clé privée

Vous disposez les deux éléments suivants :

  • Une clé privée dans client_key.pem
  • Un certificat dans cert-ouzdeville.pem

Copiez les fichiers nécessaires aux emplacements indiqués par les instructions spécifiques à votre application et votre système. Redémarrez les applications, et vous utilisez maintenant votre nouveau certificat.

 

Exemple : APACHE (Localhost):

 

Faire une requête de certification pour votre serveur Local (localhost) :

(N’oublier pas de spécifier le nom DNS du serveur pour le Common Name)

>openssl req -new -nodes -out localhost.csr -config ./openssl.cnf

Signer le certificate avac la clé privée de votre CA

>openssl ca -out localhost.pem -config ./openssl.cnf -infiles localhost.csr

Vous disposez les deux éléments suivants :

  • Une clé privée dans client_key.pem
  • Un certificat dans localhost.pem

Pour envoyer le certificat à quelqu’un on utilise un format DER

>openssl x509 -in localhost.pem  -out localhost.der.crt -outform DER

Après avoir obtenu la paire de clés (certificat et clé privée) pour le server, On passe à la configuration de ce dernier pour utiliser SSL.

Ouvrir le fichier de configuration d’Apache (httpd.conf) et changer

# LoadModule ssl_module modules/mod_ssl.so

En (enlever le #)

LoadModule ssl_module modules/mod_ssl.so

A la fin du fichier ajouter et corriger DocumentRoot, Directory, SSLCertificateFile, SSLCertificateKeyFile

 

<VirtualHost localhost:443>

        DocumentRoot « le_chemin_du_WWW »

        ServerName  localhost

    <Directory « le_chemin_du_WWW« >

        Options Indexes MultiViews FollowSymLinks

        AllowOverride None

        Order deny,allow

        Deny from all

        Allow from all

    </Directory>       

    SSLEngine on

    SSLCertificateFile « chemin_de_localhost.pem »

    SSLCertificateKeyFile « chemin_de_ key.pem »

</VirtualHost>