HTTPS mise en place d’un certificat auto signé
Présentation et distribution utilisée :
Dans cet article, nous allons mettre en place HTTPS sur un serveur dédié. Ce serveur est installé sur une machine virtuelle VirtualBox dans lequel une distribution Debian 4.6.3-14 est installée.
J’attire votre attention sur le paramétrage réseau mis en place sur VirtualBox : NAT avec redirection de port.
A la fin de nos manipulations, l’adresse web à utiliser sera donc https://192.168.56.1:4444
Enfin, vous devez disposer des droit en root pour pouvoir réaliser ce tutoriel.
Création des clés privées et certificats
Dans cette première partie, nous allons créer des fichiers qui vont contenir des chaînes de caractères : clé SSL et certficat x509. L’ordre de création est important, car les fichiers sont dépendants les uns des autres.
Création d’un dossier dédié :
Tout d’abord il faut créer un dossier qui va contenir l’ensemble des clés privés et certificats :
Shell
mkdir /etc/ssl/private/ cd /etc/ssl/private/
clé privée du serveur :
Shell
openssl genrsa -out server.key 2048 chmod 400 server.key
La commande génère une fichier contenant une suite de caractère. Cette suite de caractère est une clé SSL. Cette clé est dite privée car elle n’est pas partagée. Il est conseillé de la protéger en faisant un chmod 400
demande de signature certificat du serveur :
A partir de server.key (votre clé SSL Privée), nous allons créer un fichier de demande de signature de certificat (CSR Certificate Signing Request) pour notre serveur :
Shell
openssl req -new -key server.key -out server.csr
La commande génère le fichier server.csr. Ce fichier contient la clé publique à certifier.
Maintenant, deux choix s’offrent à nous :
- envoyer le fichier server.csr à un organisme (le tiers de confiance ou l’autorité de certification (AC) comme VeriSign ou Comodo aussi appelés Public Key Infrastructure (PKI)) et ainsi obtenir le certificat dûment signé par la clé privée de l’organisme (après avoir payé)
- ou bien signer vous-même le certificat.
C’est le deuxième cas que nous allons traiter ici.
Remarque : Depuis mi 2015, une nouvelle autorité de certification a été créée par un consortium de grandes société du web letsencrypt.org. Cette autorité réalise des certifications gratuitement. Via un des scripts bash et python, à installer sur son serveur dédié, il est désormais possible de réaliser une certification gratuite.
clé privée du l’autorité de certification (AC) :
Pour signer un certificat, nous devons devenir notre propre autorité de certification, cela implique donc de générer une clé (ca.key) et un certificat auto-signé (ca.cert).
Shell
openssl genrsa -out ca.key 2048 chmod 400 ca.key
La commande génère le fichier ca.key : clé SSL privée de notre AC.
certificat autosigné de l’autorité de certification (AC) :
A partir de ca.key (clé SSL de l’AC), nous créons un certificat x509 pour une durée de validité de 10 ans auto-signé :
Shell
openssl req -new -x509 -days 3650 -key ca.key -out ca.cert
Attention : le nom de « Common Name » doit être différent de celui qui a été donné précédemment.
signature du certificat serveur par le CA :
Enfin la commande suivante signe la demande de certificat :
Shell
openssl x509 -req -in server.csr -out server.cert -CA ca.cert -CAkey ca.key -CAcreateserial -days 365Le certificat signé est le fichier « server.cert ».
Résultat
Au final, le dossier /etc/ssl/private contient désormais 5 fichiers :
Shell
ls -al /etc/ssl/private
apache
Maintenant, que nous avons créer l’ensemble de nos clés et de nos certificats, nous pouvons modifier la configuration de apache dans cette deuxième partie :
activer ssl :
Shell
a2enmod ssl
modifier le fichier de configuration ports.conf :
Cette première modification va permettre au serveur apache d’écouter le port 443
Shell
vi /etc/apache2/ports.conf
<IfModule_ssl.c> # vérifier que ces lignes sont bien présentes dans le fichier sinon les ajouter Listen 443 </IfModule>
modifier le fichier de configuration apache2.conf :
Dans le fichier de conf de apache, nous allons ajouter de nouvelles directives pour le serveur apache lorsqu’une requête est reçue sur le port 443. Si demande sur ce port, apache va utiliser :
- après vérification que le module ssl est actif : SSLEngine on
- en utilisant la clé privée : SSLCertificateFile /etc/ssl/private/server.cert
- le certificat autosigné : SSLCertificateKeyFile /etc/ssl/private/server.key
Shell
vi /etc/apache2/site-enabled/000-default
Charger les nouveaux paramètres :
Shell
/etc/init.d/apache2 restart
Tester
Dernière partie de ce tutoriel, il ne reste plus qu’à tester si le certificat autosigné est accepté pour les principaux navigateurs du marché :
Firefox
Après avoir accepté l’exception de sécurité, HTTPS fonctionne avec Firefox :
Chrome
Chrome refuse catégoriquement le certificat mis en place avec le code erreur : NET::ERR_CRT_INVALID
Pour débloquer la situation, nous allons réduire le niveau de sécurité de Chrome pour les certificats délivré en local via la commande : chrome://flags/#allow-insecure-localhost (à saisir dans la barre d’adresse)
D’autres solutions alternatives sont présentées dans cette page stackoverflow