Configurer Apache avec SSL

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é !

1 pensée sur “Configurer Apache avec SSL”

Laisser un commentaire