Mise en place de certificats SSL sous Apache 2

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search

1 Introduction

Les certificats ne sont pas toujours simple à comprendre et à mettre ne place. Néanmoins, je vais essayer de faire claire. Pour les personnes qui souhaitent être signé par une autorité de certification gratuite, je vous invite à aller sur le site CACert.

2 Installation

2.1 Debian

Encore une fois, c'est assez simple ici :

apt-get install openssl

Ensuite vous allez vous télécharger un petit programme qui va vous simplifier la vie :

cd ~/
mkdir ssl

Voici le fichier à télécharger et à mettre dans votre dossier ssl.

Une fois fait décompressez le :

tar -xzvf cert_manager.tar.gz

2.2 OpenBSD

Pour OpenBSD, rien de spéciale à installer. Apache est fourni en standart avec le module SSL.

3 Configuration

4 Debian

Rendons nous dans le dossier décompressé :

cd CERT_MANAGER

Si vous souhaitez changer le nombre de jours pour la validité de votre certificat, éditez le fichier ca_openssl.cnf et modifiez la ligne 39 :

default_days    = 365

Changez 365 par ce que vous voulez (3650 pour 10 ans par exemple).

4.1 Création d'une autorité de certification

Nous allons maintenant créer l'autorité de certification de notre réseau local. En premier lieu, nous initialisons notre environnement de gestion des certificats :

./cert_manager.sh --init

Cette commande crée les dossiers et fichiers nécessaires au bon fonctionnement de notre script et vous pose les questions nécessaires à la configuration de votre autorité de certification :

You will now be asked to give informations for your certificate authority.
Description du domaine [défaut : Domaine local]: Deimos
Code de votre pays [défaut : FR]: 
Nom de votre région [défaut : Ile de France]: 
Nom de votre ville [défaut : Paris]: 
Nom de votre domaine [défaut : domain.local]: www.deimos.fr
Email de l'administrateur [défaut : root@domain.local]: root@deimos.fr

Nous créons ensuite notre autorité de certification :

./cert_manager.sh --create-ca

Vous disposez à présent du nécessaire pour signer vos propres certificats.

4.2 Création d'un certificat serveur pour notre réseau local

Maintenant que vous disposez d'une autorité de certification, nous allons créer une requête de certification afin d'obtenir au final un certificat signé par notre autorité. Par exemple, pour créer un certificat pour notre serveur HTTPS :

./cert_manager.sh --generate-csr=https

Remarque: https est utilisé pour générer le nom de fichier de la requête. Il est préférable que cette valeur ne contienne ni espace, ni caractères spéciaux.

Vous devez alors saisir les informations de votre certificat :

You will now be asked to give informations for your certificate authority.
Type de serveur [défault : HTTP server]: HTTPS server
Code de votre pays [défaut : FR]: 
Nom de votre région [défaut : Ile de France]: 
Nom de votre ville [défaut : Paris]: 
Email de l'administrateur [défaut : root@deimos.fr]: 
Nom de votre domaine [défaut : domain.local]: www.deimos.fr
Noms de domaines supplémentaires, un par ligne. Finissez par une ligne vide.
SubjectAltName: DNS:doc.deimos.fr
SubjectAltName: DNS:imp.deimos.fr
SubjectAltName: DNS:mail.deimos.fr
SubjectAltName: DNS:

Remarque: Comme vous pouvez le voir, cet outil vous donne la possibilité de générer des certificats valides pour plusieurs noms de domaines.

A la fin de la procédure, l'outil vous affiche la requête créée car vous pouvez, si vous le souhaitez, faire signer cette requête par le site CACert.

Si le certificat est destiné à votre réseau local, vous pouvez utiliser votre autorité de certification pour le signer :

./cert_manager.sh --sign-csr=https

Cette commande vous affiche les informations incluses dans la demande de certificat et vous demande si vous acceptez de le signer :

Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y

Vous disposez à présent de 2 fichiers qui ensemble forment votre certificat :

./CERTIFICATES/https_cert.pem
./PRIVATE_KEYS/https_key.pem

Il vous suffit a présent de copier ces fichiers et la clef publique de votre autorité de certification à l'endroit approprié pour la configuration de votre serveur :

./CERTIFICATE_AUTHORITY/ca-cert.pem

4.3 Intégration dans Apache

Pour la partie Apache, c'est asez simple, il suffit de copier certains fichiers :

mkdir -p /etc/apache2/ssl/
cp CERTIFICATE_AUTHORITY/ca-cert.pem /etc/apache2/ssl/deimos.fr.ca.crt
cp CERTIFICATES/https_cert.cert /etc/apache2/ssl/deimos.fr.crt
cp PRIVATE_KEYS/https_key.pem /etc/apache2/ssl/deimos.fr.key

Puis mettre ceci dans un VirtualHost au niveau d'Apache (faire un Virtualhost spécial SSL) :

<VirtualHost *:443>
        ServerAdmin deimos@deimos.fr
        ServerName fire.deimos.fr
 
        SSLEngine on
        SSLCACertificateFile /etc/apache2/ssl/deimos.fr.ca.crt
        SSLCertificateFile /etc/apache2/ssl/deimos.fr.crt
        SSLCertificateKeyFile /etc/apache2/ssl/deimos.fr.key
 
        DocumentRoot /var/www/
 
        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all 
        </Directory>
</VirtualHost>

4.4 OpenBSD

Pour générer les certificats, voici la marche à suivre :

Command
cd /etc/ssl
openssl genrsa -out /etc/ssl/private/server.key 2048
openssl req -new -key /etc/ssl/private/server.key -out /etc/ssl/private/server.csr
openssl x509 -req -days 3650 -in /etc/ssl/private/server.csr -signkey /etc/ssl/private/server.key -out /etc/ssl/server.crt

5 Configuration d'Apache

5.1 Debian

Pour finir, ajouter ceci à /etc/apache2/ports.conf :

Listen 443

Il ne reste plus qu'à activer le mod ssl pour la configuration :

a2enmod ssl

On peut maintenant admirer le résultat en redémarrant Apache2 :-) :

/etc/init.d/apache2 restart

5.2 OpenBSD

6 Multi-VirtualHost SSL

Comme tout le monde, un jour tu as essayé d’avoir des VHost en ssl, et les gens d’Apache t’ont informé que tu peux crever. Le problème étant que tu ne peux avoir qu’un seul certificat car les infos comme le Host sont à l’intérieur de la requête, et ne sont pas accessibles à la couche qui décide du certificat à utiliser et s’occuppe du chiffrement.

Il existait des trucs pas beaux pour éviter le warning dans le browser, genre mettre un certificat pour *.mondomainedelamortquitue.biz mais c’est mort si tu as plusieurs domaines sur le serveur.

Donc voici la solution qui explique que même si la lib OpenSSL ne supporte pas l’extension TLS qu’il te faut (SNI), du coté de chez GNU c’est supporté depuis 2 ans. Voilà la documentation tant attendue :

Documentation sur l'implémentation du multi-SSL avec mod_gnutls
Documentation on enabling multiple HTTPS Sites For one IP using TLS extensions

7 Références

SSL and Certificates Documentations
http://www.traduc.org/docs/HOWTO/lecture/SSL-Certificates-HOWTO.html
Documentation pour OpenBSD