Adrien's log

Yet Another Note Pad

Mettre en place HTTPS avec un certificat auto-signé

by adrien on 27 juillet 2011

Afin de protéger votre vie privée ou celle de vos visiteurs, c’est à la mode en ce moment, nous allons voir dans cette article comment mettre une architecture PKI en place, comment signer nous même nos certificats et enfin les utiliser avec Apache.

Création de la PKI

Une PKI, pour Public Key Infrastructure, est une organisation hiérarchique permettant la gestion des certificats. Pour la mettre en place, nous utiliserons OpenSSL.

Nous allons commencer par le commencement : la mise en place de la tête, le CA.

Commencez par créer un dossier avec les droits qui vont bien, cad, personne, à part vous, n’a le droit de lire ou modifier le contenu de celui-ci.

Première étape, la création de la clé privée. Cette dernière ne doit jamais être diffusée, sinon, tout les certificats émit depuis votre CA pourront être corrompues.

openssl genrsa -des3 -out ca.key 2048

Le premier paramètre demande la création d’une clé RSA, le second est l’algorithme de chiffrement, le troisième est le nom du fichier dans lequel se trouvera la clé, et enfin le dernier est le nombre de bit de la clé. Cette clé servira à signer les certificats émit par notre CA.

Bien, maintenant, pour obtenir un certificat, il faut en faire la demande. C’est à cela que servent les fichiers CSR (Certificat Signing Request). Voyons la création d’une requête afin d’émettre un certificat pour notre CA :

openssl req -new -key ca.key -out ca.csr

OpenSSL vous demandera la passphrase que vous avez renseigné lors de la création de la clé privée et toute une foule d’autres informations que vous devrez complété. Ensuite passons à la création du certificat que nous avons demandé :

openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt

Pour les paramètres, le premier indique le type de certificat que l’on va créer, le second indique que l’on va répondre à une requête, le troisième le nombre de jours de validité du certificat, le quatrième indique le chemin vers le fichier qui contient le requête, le cinquième idem mais vers le clé privée et enfin le dernier indique le fichier de sortie.

Ce certificat va nous permettre de signer tout les certificats que nous émettrons depuis notre CA.

Un certificat, un !

Maintenant, sur notre serveur web, nous allons faire une demande de certificat. Commençons par créer une clé privée :

openssl genrsa -des3 -out mykey.key 1024

On évitera de mettre une clé à plus de 1024 bits, question de compatibilité. Ensuite, nous allons nous arranger pour virer la passphrase que vous avez été obligé de mettre, sinon, dès qu’un visiteur cherchera à se connecter, il lui sera demandé cette passphrase.

openssl rsa -in mykey.key -out mykey.key

Créons le CSR associé :

openssl req -new -key mykey.csr -out mycsr.csr

Enfin, après avoir transmis notre CSR à notre CA, nous pouvons créer notre certificat avec ce dernier :

openssl x509 -req -in mycsr.csr -CA ca.crt -CAkey ca.key -out mycrt.crt -CAcreateserial

La signature d’un certificat à partir d’un CA ce fait donc en renseignant le certificat et la clé privée de celui-ci. Notez que le dernier paramètre n’est utile que lors de la création du premier certificat. Et voilà, notre certificat est près à être utilisé.

Un petit souci subsiste, notre certificat est auto-signé, donc les autres machines ne connaissant pas notre CA ne nous ferons pas confiance (la page rouge sous Firefox lorsque l’on va sur un site sécurisé).

Pour palier à ce problème, il faut distribuer le certificat racine (ca.crt) et l’installer sur toutes les machines qui devront nous faire confiance. Pour un intranet, c’est jouable mais pour le réseau publique, il va falloir renoncer à faire notre CA et utilisé des services vendu par des sociétés spécialisées ou encore passer par cacert.org

Attention : La clé ne doit jamais être distribuée !

Une fois le certificat créé, il est possible de supprimé le fichier CSR associé, en effet, il devient inutile. Ensuite viens l’installation de notre certificat sur notre serveur : mettez le dans /etc/ssl/VOTREAPPLICATION où le dernier mot correspond bien sûr au nom de votre application.

Apache et SSL

Voyons maintenant la configuration d’apache. Activer le module SSL et redémarrer le service si ce n’est déjà fait.

a2enmod ssl
service apache2 restart

Nous modifierons le fichier ports.conf :

NameVirtualHost *:80
NameVirtualHost *:443
Listen 80
# If you add NameVirtualHost *:443 here, you will also have to change
# the VirtualHost statement in /etc/apache2/sites-available/default-ssl
# to
# Server Name Indication for SSL named virtual hosts is currently not
# supported by MSIE on Windows XP.
Listen 443

Enfin, dans le virtualhost de notre site, nous allons ajouter les lignes suivantes :

<VirtualHost *:443>
ServerName x-ou-y.com
DocumentRoot /var/www/x-ou-y
SSLEngine On
SSLCertificateFile /etc/ssl/apache.crt
SSLCertificateKeyFile /etc/ssl/apache.key
</VirtualHost>

Où x-ou-y.com est votre domaine, et /var/www/x-ou-y est le dossier vers votre site. Les 3 dernières lignes indique la mise en fonctionnement du SSL avec le chemin du certificat et de la clé.

Un petit reload, et c’est partit !

service apache2 reload

Précisons qu’il est impossible de mettre plusieurs virtualhost en HTTPS, il faudra soit utiliser un port différent pour chaque virtualhost utilisant SSL ou bien utiliser une adresse IP différente. Nous verrons prochainement comment palier à ce problème.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.