SSL (Secure Socket Layer) est un protocole permettant de sécuriser une communication entre deux points, typiquement un client et un serveur.
Il peut être couplé au protocole HTTP pour former le HTTP sécurisé (HTTPS) qui apporte à la communication entre le client et le serveur Web :
- la confidentialité : les données sont cryptées et donc pas lisibles par un tiers
- l'intégrité : vérification que les données n'ont pas été modifiées pendant le transport
- l'authentification : vérification que le serveur (ou le client) est bien celui qu'il prétend être
Le but de cette note est donc de configurer un serveur Web Apache pour qu'il prenne en compte le SSL, permettant ainsi d'accéder à des sites Webs en HTTPS.
1 – Préparer
Avant la configuration, il faut préparer l'opération côté SSL et côté Apache.
1.1 – SSL
L'utilisation du protocole SSL avec Apache nécessite la création d'un certificat qui sera utilisé par le serveur Apache.
Pour la création on se reportera à un article précédent : http://blog.moncoindunet.fr/linux/openssl-creer-un-certificat-auto-signe/
1.2 – Apache
Pour utiliser le protocole HTTPS avec Apache, il faut que celui-ci soit compilé avec le module SSL, et que ce dernier soit chargé dans Apache.
Pour vérifier si le module est chargé :
$ httpd -M
Loaded Modules:
core_module (static)
mpm_prefork_module (static)
http_module (static)
so_module (static)
ssl_module (shared)
Syntax OK
Sinon, se reporter au paragraphe "Compilation et installation" de l'article sur l'installation d'un serveur Apache sous Linux : http://blog.moncoindunet.fr/linux/apache-linux/installer-un-serveur-apache-avec-php-sur-linux/
L'ajout du chargement du module après compilation sera traité ci-dessous.
2 – Configurer
La configuration Apache se fait dans le fichier httpd.conf, situé pour moi dans /usr/local/apache/conf.
Le protocole HTTPS utilise par défaut le port 443. Après, tout dépends de la configuration du serveur Apache :
- soit il n'utilisera que le protocole HTTPS, et donc le serveur n'écoutera que sur le port 443
- soit il utilisera HTTPS en plus de HTTP, dans ce cas le serveur devra écouter sur deux ports (80 et 443 par défaut)
Dans le deuxième cas on utilisera un VirtualHost pour traiter la partie HTTPS. Mis à part ça, la configuration sera identique.
La première chose à faire est donc d'ajouter le module SSL dans la liste des modules chargés, s'il n'y est pas :
$ cd /usr/local/apache/conf $ vi httpd.conf
Ajouter cette ligne :
LoadModule ssl_module modules/mod_ssl.so
2.1 – Utiliser HTTPS seulement
Pour utiliser le protocole HTTPS il faut utiliser ces directives, toujours dans le fichier de configuration Apache httpd.conf :
Listen 443 https SSLEngine On SSLCertificateFile "/usr/local/openssl/ssl/certs/example.com.cert" SSLCertificateKeyFile "/usr/local/openssl/ssl/private/example.com.key"
Petite explication de texte :
- Listen : indique au serveur qu'il écoute sur le port 443, port par défaut du protocole HTTPS
- SSLEngine : pour activer le moteur SSL
- SSLCertificateFile : emplacement du certificat généré précédemment
- SSLCertificateKeyFile : emplacement de la clé privée générée précédemment
Ces 4 directives suffisent pour utiliser SSL avec Apache.
Il faut ensuite redémarrer le serveur Apache, celui-ci vous demandant le mot de passe de la clé privée pour pouvoir démarrer :
$ /usr/local/apache/bin/apachectl start Apache/2.2.16 mod_ssl/2.2.16 (Pass Phrase Dialog) Some of your private key files are encrypted for security reasons. In order to read them you have to provide the pass phrases. Server www.example.com:443 (RSA) Enter pass phrase: OK: Pass Phrase Dialog successful.
Une fois le serveur Apache démarré, on peut tester notre site avec la commande s_client de OpenSSL :
$ openssl s_client -connect www.example.com:443 CONNECTED(00000003) ... Start Time: 1284584553 Timeout : 300 (sec) Verify return code: 18 (self signed certificate)
OpenSSL affichera alors tout un tas d'information sur la connexion avec le protocole SSL. Si ça a fonctionné, il affichera notamment le contenu du certificat. Sinon, il affichera plutôt :
no peer certificate available
2.2 – Utiliser HTTP & HTTPS avec une seule adresse IP
On peut utiliser les protocoles HTTP & HTTPS sur un même serveur Apache et sur la même adresse IP en utilisant deux virtual host basés sur le nom : un pour le port 80, l'autre pour le port 443.
La configuration se fait dans le fichier de configuration Apache httpd.conf, dans lequel on peut par exemple insérer ces directives :
Listen 80 http Listen 443 https NameVirtualHost *:80 NameVirtualHost *:443 <VirtualHost *:80> ServerName www.example.com DocumentRoot "/usr/local/apache/htdocs/www" </VirtualHost> <VirtualHost *:443> ServerName ssl.example.com SSLEngine On SSLCertificateFile "/usr/local/openssl/ssl/certs/example.com.cert" SSLCertificateKeyFile "/usr/local/openssl/ssl/private/example.com.key" DocumentRoot "/usr/local/apache/htdocs/ssl" </VirtualHost>
Petite explication de texte :
- Listen : indique les ports d'écoute et les protocoles associés (les protocoles sont facultatifs)
- NameVirtualHost : spécifie les adresses et ports associés aux virtual hosts
- VirtualHost : pour déclarer un hôte virtuel sur une adresse et un port
- ServerName : nom du serveur associé à l'hôte virtuel
- SSLEngine : pour activer le moteur SSL
- SSLCertificateFile : emplacement du certificat généré précédemment
- SSLCertificateKeyFile : emplacement de la clé privée générée précédemment
- DocumentRoot : racine des pages Web associés à l'hôte virtuel
Il faut ensuite redémarrer le serveur Apache, celui-ci vous demandant le mot de passe de la clé privée pour pouvoir démarrer :
$ /usr/local/apache/bin/apachectl start Apache/2.2.16 mod_ssl/2.2.16 (Pass Phrase Dialog) Some of your private key files are encrypted for security reasons. In order to read them you have to provide the pass phrases. Server www.example.com:443 (RSA) Enter pass phrase: OK: Pass Phrase Dialog successful.
Une fois le serveur Apache démarré, on peut tester notre site avec la commande s_client de OpenSSL :
$ openssl s_client -connect ssl.example.com:443 CONNECTED(00000003) ... Start Time: 1284584553 Timeout : 300 (sec) Verify return code: 18 (self signed certificate)
OpenSSL affichera alors tout un tas d'information sur la connexion avec le protocole SSL. Si ça a fonctionné, il affichera notamment le contenu du certificat. Sinon, il affichera plutôt :
no peer certificate available
Et voilà, on dispose maintenant d'un serveur Apache pouvant servir des pages via le protocole HTTP sécurisé !
Leave a Reply