Afin de crypter les données, il faut procéder à un échange de certificats entre le navigateur et le serveur web. Le mécanisme est le suivant : Le serveur dispose d'un fichier appelé certificat contenant une clée privée et une clée publique. Il envoie au navigateur un certificat contenant des informations sur le nom de la société qui met en oeuvre le site, son pays de résidence et surtout une clée publique. La clée privée est gardée jalousement a l'abris sur le serveur. Le navigateur va donc présenter ce certificat à l'internaute des réception de celui-ci (et vous avez souvent une petite fenêtre qui vous demande d'accepter ou refuser ce certificat).

Si le certificat est accepté, le navigateur va crypter les informations à envoyer avec la clée publique, et cela garantira que seul le détenteur de la clée privée correspondante pourra décrypter les données. Ce mécanisme est néanmoins incomplet : si vos données sont en effet protégées entre le navigateur et le serveur, vous n'êtes pas sur de l'identité du serveur. Pour cela il existe des organismes comme Vérisign qui vous garantissent que le serveur avec lequel vous dialoguez est bien celui qu'il prétend être.

Pour ce faire ces organismes disposent de certificats servant à signer un certificat émis par la société du site web.

Les navigateurs intègrent automatiquement les certificats de ces grandes compagnies (appelées "autorités de certification") et peuvent vérifier si le certificat qui lui est envoyé par un site est approuvé par une de ces autorités de certification.

Voici la définition officielle disponible sur le site de Vérisign :

"Chaque certificat SSL est créé pour un serveur particulier dans un domaine spécifique pour une entité professionnelle vérifiée. Comme un passeport ou un permis de conduire, un certificat SSL est émis par une autorité de confiance, l’autorité de certification (Certification Authority, CA en abrégé). Lors de la transaction SSL, le navigateur demande l’authentification du serveur. Le client voit apparaître le nom de la société lorsqu’il clique sur certaines marques de confiance SSL (telles que le sceau VeriSign Secured™ Seal) ou utilise un navigateur prenant en charge la norme Extended Validation (Validation renforcée). Si l’information ne correspond pas ou si le certificat est périmé, le navigateur affiche un message d’erreur ou un avertissement"

Un certificat approuvé par une autorité de certification est appelé un certificat signé.

D'ailleurs quand le navigateur reçoit un certificat signé, l'internaute n'a pas à donner son approbation pour accepter / refuser le certificat : le navigateur lui fait confiance automatiquement.

La signature d'un certificat par une autorité de certification étant payante, il est nécessaire pour un développeur de pouvoir émuler la signature de certificat.

Pour ce faire il faut commencer par créer des certificats allant servir à signer les autres.

C'est parti :

- Je suppose que vous avez déjà installé openssl sur votre environnement unix.

- Je me base sur la distribution ubuntu 8.04.

La première chose à faire est de modifier un fichier de configuration pour indiquer que les certificats que nous allons créer vont être des certificats d'autorité certificatrice.

- Editer le fichier /etc/ssl/openssl.cnf.

Modifier dir pour pointer vers un dossier allant contenir tous vos futurs certificats CA. Par exemple :

dir = /opt/root-certificats/

- Toujours dans le même fichier, remplacer tous les 

basicConstraints=CA:FALSE

par

basicConstraints=CA:TRUE

(3 occurences dans le fichier par défaut normalement).

Cet attribut sera présent dans les certificats générés et indique au navigateur qu'il sagit bien d'un certificat émanant d'une CA.

- Modifier le fichier /usr/lib/ssl/misc/CA.sh(ce fichier est un script shell vous permettant de gagner un temps précieux pour créer vos certificats CA, il lance a votre place bon nombre de commandes du jeu d'outils openssl).

CATOP=/opt/root-certificats

- Fermer le fichier ci-dessus et lancer la ldc :
/usr/lib/ssl/misc/CA.sh -newca

- Répondre aux questions en notant bien la passphrase demandée.

Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:Paris
Locality Name (eg, city) []:Paris
Organization Name (eg, company) [Internet Widgits Pty Ltd]:David ROBIN Certification corp
Organizational Unit Name (eg, section) []:certification dpt
Common Name (eg, YOUR name) []:CATOPID
Email Address []:votreemail@mail.net

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:yourpassword

- Pour certaines opérations par la suite il faut convertir le fichier .pem du certificat en .der avec la ldc suivante :

openssl x509 -in /opt/root-certificats/cacert.pem -inform PEM -out /opt/root-certificats/cacert.der -outform DER

- Ré-editer le fichier /etc/ssl/openssl.cnf

Remplacer tous les  basicConstraints=CA:TRUE ou basicConstraints=CA:true par basicConstraints=CA:FALSE (4 occurences cette fois car une des entrées du fichier d'origine était déjà a true)

Ainsi tous les certificats créés par la suite n'auront pas l'attribut indiquant qu'il sagit d'un certificat émanant d'une authorité certificatrice.

That's all : vos certificats CA sont créés.

Il reste une dernière petite étape : importer votre certificats dans Firefox (ou IE).

Par défaut firefox inclus un certains de certificats émanants de véritables autorités de certification.

Il faut enrichir cette liste avec notre autorité de certification nouvellement créée.

Aller dans Préférences > Avancé > Chiffrement et cliquer sur le bouton "Afficher les certificats".

Cliquer sur l'onglet "Autorités" de la nouvelle fenêtre.

Ici il faut importer le fichier /opt/root-certificats/cacert.der (ce fichier doit être distribué sur tout vos postes clients).

Vous devriez voir votre autorité parmis celle déjà présente, comme sur le screenshot ci-dessous :

Par la suite, nous utiliserons ces certificats racines afin de signer d'autres certificats, comme dans mon post suivant sur tomcat en mode APR.