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

nat

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

private-key-serveur

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

certificat-serveur

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

private-key-serveur

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

certificat-ac

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 365

Le 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

result

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

a2mod

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>

ports.conf

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

apache.conf

Charger les nouveaux paramètres :

Shell

/etc/init.d/apache2 restart

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 :

firefox

Chrome

Chrome refuse catégoriquement le certificat mis en place avec le code erreur : NET::ERR_CRT_INVALID

chrome-alert

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)

chrome-setting

D’autres solutions alternatives sont présentées dans cette page stackoverflow