Apache2 - Mod SSL

Prérequis :

- un serveur web Apache2 (pas le 1 !) et un site web sur lequel on désire mettre en place le https://

- openssl d'installé (sinon l'installer avec votre gestionnaire de paquet, sous Debian c'est : apt-get install openssl )

 

0. A quoi bon du SSL ?

Le SSL permet de crypter les échanges HTTP. Par défaut (http), toutes les données que vous échangez avec un serveur web passent en clair sur Internet. Cela inclu le contenu des pages web visitées mais aussi les informations transmises par 'POST4, càd ce que vous mettez dans un formulaire. Par exemple quand vous vous loguez sur un forum avec vos identifiants login/mot de passe. Les deux transitent vers le serveur web et sont lisibles. Le HTTPS permet de crypter ces informations avec une clé que seul le serveur web possède. Plus d'infos sur ce système ici. Bref, cela rend vos données illisibles en cours de route et cela certifie à vos visiteurs qu'ils arrivent sur le von serveur (il est possible de les rediriger vers un serveur pirate sans qu'ils ne le remarquent).

1. Le certificat et l'autorité.

Le SSL fonctionne ainsi : on a besoin d'un certificat et une clé. La clé, chacun peut la générer sur son serveur. Ensuite, il faut signer cette clé avec un certificat. Deux possibilités : la signer soit-même ou faire appel à une autorité de certification reconnue mondialement. Les services de ces autorités sont payants. Dans le premier cas, les visiteurs du HTTPS verront un message désagréable de leur navigateur disant que l'autorité (qui est votre serveur) n'est pas reconnue comme officielle. Dans le cas payant, ils ne verront pas ce message.

Si on possède un site web avec une partie administration sensible, générer un certificat soit-même est suffisant. Si on veut en faire bénéficier les visiteurs, il vaut mieux en acheter un. OVH propose des certificats au prix attractif de 39,99€ HT par an (lien).

 

2. Activer le support SSL sous Apache2

C'est très simple, une seule commande : a2enmod ssl ; /etc/init.d/apache2 force-reload

 

3. Générer et signer un certificat soit-même.

On doit faire 3 choses : générer la clé, créer une autorité de certification (càd le certificat qui va pouvoir signer notre clé) et enfin signer la clé.

On commence par se placer dans un répertoire où on va stocker nos clés : cd /etc/apache2 puis mkdir cles-ssl && cd cles-ssl .

On crée une nouvelle clé RSA :

r10013:/etc/apache2/cles-ssl# openssl genrsa -out cle.key 1024
Generating RSA private key, 1024 bit long modulus
....++++++
..............++++++
e is 65537 (0x10001)

Puis sur base de cette clé on crée le certificat :

r10013:/etc/apache2/cles-ssl# openssl req -new -key cle.key -out cle.csr
Enter pass phrase for cle.key: //entrer un mot de passe pour la clé
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.

-----
Country Name (2 letter code) [AU]:
// les deux lettres du pays (optionnel)
State or Province Name (full name) [Some-State]: // le nom du pays (optionnel)
Locality Name (eg, city) []: Enter
Organization Name (eg, company) [Internet Widgits Pty Ltd]: Enter
Organizational Unit Name (eg, section) []: Enter
Common Name (eg, YOUR name) []: Enter
Email Address []: Enter

Please enter the following 'extra' attributes
to be sent with your certificate request

A challenge password []: Enter
An optional company name []: Enter

Et enfin, on peut signer notre certificat(pour 10 ans comme ça on a la paix) :

r10013:/etc/apache2/cles-ssl# openssl x509 -req -days 3650 -in cle.csr -signkey cle.key -out cle.crt
Signature ok
subject=/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd
Getting Private key

On a donc :

r10013:/etc/apache2/cles-ssl# ls
cle.crt cle.csr cle.key

Il reste quelques réglages : donner les bons droits à ces clés :

chmod 600 cle.key
chmod 600 cle.crt

 

4. Mettre en place le HTTPS.

Il va falloir éditer le fichier de configuration du VirtualHost correspondant au site web qu'on veut passer en SSL. Sous Apache2, ces fichiers se trouvent dans /etc/apache2/sites-available :

On prend le virtualhost du HTTP, on en fait un copier/coller que l'on modifie ainsi:

AVANT :

<VirtualHost VOTRE_IP:80>
ServerName www.domaine.com
DocumentRoot /home/domaine/www/
<Directory /home/domaine/www/>
Options -Indexes FollowSymLinks MultiViews
AllowOverride All
Order deny,allow
Allow from all
</Directory>
LogLevel warn
ErrorLog /home/domaine/logs/error.log
LogLevel warn
CustomLog /home/domaine/logs/access.log combined
ServerSignature Off
</VirtualHost>

APRES :

<VirtualHost VOTRE_IP:443>
ServerName www.domaine.com
DocumentRoot /home/domaine/www/
<Directory /home/domaine/www/>
Options -Indexes FollowSymLinks MultiViews
AllowOverride All
Order deny,allow
Allow from all
</Directory>
LogLevel warn
ErrorLog /home/domaine/logs/error.log
LogLevel warn
CustomLog /home/domaine/logs/access.log combined
ServerSignature Off

SSLEngine on
SSLCertificateFile /etc/apache2/cles-ssl/cle.crt
SSLCertificateKeyFile /etc/apache2/cles-ssl/cle.key


</VirtualHost>

Et on oublie pas de modifier le chemin de cle.crt et cle.key si on a pas choisi le même que dans ce tuto (si vous avez acheté un certificat il suffit de créer un fichier, d'y mettre son contenu et c'est fait).

Rajout du NameVirtualHost : si c'est la première fois que vous rajoutez un HTTPS sur un des sites web de votre machine, il faudra ajouter la directive suivante tout au début du fichier de conf (/etc/apache2/sites-available/) : NameVirtualHost VOTRE_IP:443

ATTENTION : c'est bien un rajout de VirtualHost qu'il faut faire, pas une modification de celui déjà présent (sinon votre site ne répondra plus qu'en HTTPS et pas en HTTP).

5. Supplément : réaliser une redirection.

Pour ceux qui veulent exploiter uniquement le HTTPS et créer une redirection http://domaine.com ---> https://domaine.com, il faut supprimer le VirtualHost écoutant sur le port 80 et y mettre à la place :

<VirtualHost VOTRE_IP:80>
ServerName domaine.com
Redirect / https://domaine.com
</VirtualHost>
Pour toutes questions, suggestions, merci de poster sur nos forums.