Précautions concernant la sécurité
Apache gère la sécurité en prenant les précautions suivantes :
- Lorsque le serveur démarre, il se connecte au réseau et crée de nombreuses copies de lui-même. Ces instances changent immédiatement de propriétaire pour s’exécuter sous le compte d’un utilisateur plus sûr, webuser du groupe webgroup dans nos exemples (voir le chapitre 2). Seul le processus initial continue de s’exécuter sous le compte du super-utilisateur, mais les requêtes réseau ne sont traitées que par les nouveaux processus : le processus initial ne s’occupe jamais du réseau, il se contente de superviser le fonctionnement des processus fils, en lance de nouveaux si besoin est et supprime ceux qui sont en trop si la charge du réseau décroît.
- Tout envoi aux shells est soigneusement testé pour repérer les caractères dangereux, mais cela ne résoud qu’à moitié le problème. Les auteurs de scripts CGI (voir le chapitre 13) doivent également faire attention de ne pas tomber dans les pièges.
Considérons, par exemple, ce simple script shell :
#!/bin/sh
cat /repertoire/$1
Imaginez que vous utilisez un script comme celui-ci pour présenter à l’utilisateur le contenu d’un fichier qu’il aurait choisi dans un menu, par exemple. Ce simple code pose pourtant plusieurs problèmes, le plus évident étant que si l’on arrive à faire en sorte que $1 contienne "etc/passwd", le serveur affichera le contenu de votre base de données des utilisateurs ! Supposons que vous ayez corrigé ce problème (l’expérience a prouvé qu’il n’était pas trivial à résoudre), un autre surgit : si $1 vaut "xx /etc/passwd", le script affichera /repertoire/xx et /etc/passwd. Comme vous pouvez le constater, il faut à la fois du soin et de l’imagination pour être totalement sécurisé et, maheureusement, il n’existe pas de formule toute faite -- bien que, en général, s’assurer que les entrées des scripts ne contiennent que les caractères voulus (nous conseillons de n’autoriser que les caractères alphanumériques) est un très bon point de départ.
Les utilisateurs internes posent des problèmes spécifiques. Le principal étant qu’ils veulent écrire des scripts CGI fonctionnant avec leurs pages. Dans une installation classique, le client, qui s’exécute sous le compte Apache ( webuser ou webgroup ) n’a pas suffisamment de droits pour lancer ces scripts de façon correcte : ce problème peut être résolu grâce à suEXEC (voir la section suEXEC et Unix dans le chapitre 16).
SSL avec Apache 1.3
Cette section présente la mise en place d’une version Apache 1.3.X gérant le protocole HTTPS (HTTP over SSL). Actuellement, cela n’est possible qu’avec les implémentations Unix et, étant donnés les nombreux problèmes de sécurité de Win32, il y a peu d’intérêt a essayer d’implémenter SSL dans la version d’Apache pour cette plateforme.
Il existe plusieurs façons d’implémenter SSL dans Apache : Apache-SSL et mod_ssl. Toutes deux sont des implémentations libres des mêmes algorithmes de base (il existe également des produits commerciaux distribués par RedHat, Covalent et C2Net). Nous décrirons d’abord Apache-SSL car l’un des auteurs de ce livre, Ben Laurie, est responsable de son développement.
La première étape consiste à utiliser la bonne version d’Apache (voir le chapitre 1). Consultez également la page d’accueil de Apache-SSL, http://www.apache-ssl.org/ pour prendre connaissance des dernières informations.
Apache-SSL
La partie Apache de Apache-SSL est un ensemble de patches à appliquer au code source du serveur que vous pouvez télécharger à partir de ftp://ftp.ox.ac.uk/pub/crypto/SSL/Apache-SSL/. Il y a une version de patches par version d’Apache. Attention, la liste des fichiers du site FTP étant classée par ordre alphabétique, la version la plus récente se trouve au milieu de la liste et non à la fin. Au moment où nous traduisons, il s’agit de l’archive apache_1.3.27+ssl_1.48.tgz.
Il y a ici un problème de sécurité évident : un sale type ingénieux pourrait s’économiser le déchiffrement de vos messages en allant dans les sources et en y insérant du code qui, par exemple, lui enverrait par courrier électronique les textes en clair. En langage cryptographique, c’est ce que l’on appelle un cheval de Troie. Pour être sûr que le source que vous téléchargez n’en contient pas, certains calculent des sommes de contrôle MD5 des fichiers afin de vérifier qu’ils n’ont pas été altérés. Cependant, un sale type vraiment rusé pourrait également modifier ces sommes de contrôle : une meilleure solution consiste à fournir des signatures PGP qui ne peuvent être trafiquées. C’est ce que nous utilisons ici, avec la signature de Ben Laurie.
Mais, qui est ce Ben Laurie ? Pour l’instant, la réponse se trouve dans un livre, Global Internet Trust Register (voir http://www.cl.cam.ac.uk/Research/Security/Trust-Register/ ). Il s’agit clairement d’un problème qui n’est pas près de disparaître : consultez le site keyman.aldigital.co.uk.
Vous devez décompacter les fichiers dans le répertoire d’Apache -- qui doit, bien sûr, contenir les sources de la version du serveur correspondant au nom du fichier que vous avez récupéré.
OpenSSL
Le fichier README.SSL vous indique comment obtenir OpenSSL à partir du site http://www.openssl.org, où vous trouverez cette notice que nous vous conseillons de lire :
N’OUBLIEZ PAS QUE L’IMPORTATION/EXPORTATION ET/OU L’UTILISATION DE LOGICIELS
DE CRYPTOGRAPHIE FORTE, LA FOURNITURE DE MOYENS CRYPTOGRAPHIQUES OU MÊME,
SIMPLEMENT, LA COMMUNICATION DE DÉTAILS TECHNIQUES SUR LES LOGICIELS
CRYPTOGRAPHIQUES SONT ILLÉGALES DANS CERTAINS PAYS. PAR CONSÉQUENT, SI VOUS IMPORTEZ CE PAQUETAGE DANS VOTRE PAYS, SI VOUS LE REDISTRIBUEZ OU SI VOUS ENVOYEZ PAR EMAIL DES SUGGESTIONS TECHNIQUES OU DES PATCHES À L’AUTEUR OU À D’AUTRES PERSONNES, VOUS ÊTES FORTEMENT INVITÉ À PRÊTER ATTENTION AUX LOIS
QUI S’APPLIQUENT À VOTRE SITUATION. LES AUTEURS D’OPENSSL NE POURRONT ÊTRE
TENUS POUR RESPONSABLES DES VIOLATIONS QUE VOUS POURRIEZ COMMETTRE.
SOYEZ PRUDENTS, IL EN VA DE VOTRE RESPONSABILITÉ.
Nous avons téléchargé apache_1.3.27+ssl_1.48.tar.gz et nous avons désarchivé les fichiers dans /usr/src/openssl. Parmi eux se trouvent deux scripts de configuration : config et Configure. Le premier tente de découvrir votre système d’exploitation puis lance le second. La compilation est assez standard, bien que longue, et installe les bibliothèques /usr/local/ssl. Vous pouvez changer cet emplacement par défaut en utilisant la commande suivante :
./config --prefix=< répertoire où placer .bin, .lib, ...include/openssl >.
En ce qui nous concerne, nous avons fait simple :
./config
make
make test
make install
La dernière étape place différents outils de chiffrement dans /usr/local/ssl/bin. Si vous préférez qu’il se trouvent dans /usr/local/bin, vous pouvez les y copier.
Recompilation d’Apache
Lorsque la compilation précédente est terminé, on revient au répertoire des sources Apache ( /usr/src/apache/apache_1.3.27 ) et on supprime tout ce qu’il contient. Il s’agit d’une étape essentielle : sans elle, le processus échouera sûrement. La méthode la plus simple consiste à se placer dans le répertoire de niveau supérieur (ici, /usr/src/apache ), à s’assurer que l’archive apache_1.3.27.tar s’y trouve, puis à lancer la commande suivante :
rm -r apache_1.3.27
On réinstalle ensuite toutes les sources en faisant :
tar xvf apache_1.3.27.tar
Puis, nous nous plaçons dans .apache_1.3.19, nous redécompactons Apache-SSL et nous lançons le script FixPatch, qui insère les chemins vers les éléments d’OpenSSL dans les scripts de compilation d’Apache. Si cela ne fonctionne pas, ou si vous n’êtes pas si aventureux, vous pouvez obtenir le même résultat en utilisant une méthode plus manuelle :
patch -p1 < SSLpatch
Le fichier README.SSL de .apache_1.3.27 indique que vous devrez ensuite « configurer les variables SSL_* de src/Configuration avec les bonnes valeurs, sauf si vous avez lancé FixPatch ». Comme FixPatch produit les lignes suivantes :
SSL_BASE=/usr/local/ssl
SSL_INCLUDE= -I$(SSL_BASE)/include
SSL_CFLAGS= -DAPACHE_SSL
SSL_LIB_DIR=/usr/local/ssl/lib
SSL_LIBS= -L$(SSL_LIB_DIR) -lssl -lcrypto
SSL_APP_DIR=/usr/local/ssl/bin
SSL_APP=/usr/local/ssl/bin/openssl
vous devrez les reproduire manuellement dans .src/Configuration.
Si vous voulez inclure d’autres modules dans Apache, c’est le moment de modifier le fichier .src/Configuration comme nous l’avons décrit au chapitre 1. Puis, il faut recompiler Apache. Si nous nous plaçons dans le répertoire .src , la commande ./Configure produit :
Configuration.tmpl is more recent than Configuration
Make sure that Configuration is valid and, if it is, simply
'touch Configuration' and re-run ./Configure again.
En bon français, cela signifie que make a décidé qu’il n’y avait rien à faire puisque la date de modification de Configuration était antérieure à celle de Configuration.tmpl (le fichier qu’elle est censée produire). La commande touch d’Unix est très utile car elle permet de mettre à jour la date d’un fichier pour, précisément, règler ce type de problème. Après l’avoir utilisée, ./Configure s’exécutera normalement, et make produira un exécutable httpsd que l’on placera dans /usr/local/bin, à côté de httpd.
Fichier de configuration
Pour configurer Apache-SSL pour votre site, vous pouvez vous aider du fichier d’exemple qui se trouve dans le répertoire .apache_1.3.XX/SSLconf/conf et qui vous indiquera tout ce que vous devez savoir.
Ce fichier de configuration contient sûrement plus d’informations que vous n’en avez besoin : un fichier bien plus simple se trouve dans site.ssl/apache_1.3 (Apache 2 est suffisamment différent pour qu’il y ait un site.ssl/apache_2 ). Ce fichier illustre un type de site assez courant, comportant une partie non sécurisée à laquelle on accède de façon traditionnelle via l’URL http://www.butterthlies.com et une partie sécurisée (destinée aux vendeurs, ici) joignable via l’URL https://sales.butterthlies.com suivie d’un nom d’utilisateur et d’un mot de passe -- qui, heureusement, est désormais chiffré. Dans une situation réelle, la partie sécurisée pourrait être un ensemble de pages de maintenance, de rapports statistiques, etc. qui ne serait accessible qu’aux personnes chargées de la gestion du site. Cela pourrait également être un sanctuaire réservé aux abonnés, un ensemble de pages permettant des échanges monétaires, ou tout autre contenu secret...
User webuser
Group webgroup
LogLevel notice
LogFormat "%h %l %t \"%r\" %s %b %a %{user-agent}i %U" sidney
SSLCacheServerPort 1234
SSLCacheServerPath /usr/src/apache/apache_1.3.19/src/modules/ssl/gcache
SSLCertificateFile /usr/src/apache/apache_1.3.19/SSLconf/conf/new1.cert.cert
SSLCertificateKeyFile /usr/src/apache/apache_1.3.19/SSLconf/conf/privkey.pem
SSLVerifyClient 0
SSLFakeBasicAuth
SSLSessionCacheTimeout 3600
SSLDisable
Listen 192.168.123.2:80
Listen 192.168.123.2:443
<VirtualHost 192.168.123.2:80>
SSLDisable
ServerName www.butterthlies.com
DocumentRoot /usr/www/APACHE3/site.virtual/htdocs/customers
ErrorLog /usr/www/APACHE3/site.ssl/apache_1.3/logs/error_log
CustomLog /usr/www/APACHE3/site.ssl/apache_1.3/logs/butterthlies_log sidney
</VirtualHost>
<VirtualHost 192.168.123.2:443>
ServerName sales.butterthlies.com
SSLEnable
DocumentRoot /usr/www/APACHE3/site.virtual/htdocs/salesmen
ErrorLog /usr/www/APACHE3/site.ssl/apache_1.3/logs/error_log
CustomLog /usr/www/APACHE3/site.ssl/apache_1.3/logs/butterthlies_log sidney
<Directory /usr/www/APACHE3/site.virtual/htdocs/salesmen>
AuthType Basic
AuthName darkness
AuthUserFile /usr/www/APACHE3/ok_users/sales
AuthGroupFile /usr/www/APACHE3/ok_users/groups
Require group cleaners
</Directory>
</VirtualHost>
Vous remarquerez que SSL est désactivé globalement et qu’il n’est activé que pour le conteneur qui définit le site virtuel des ventes. Lorsque SSL est désactivé, la version sécurisée d’Apache, httpsd, se comporte comme la version standard, httpd. Nous noterez également que nous ne pouvons pas utiliser un hébergement virtuel par nom car l’URL à laquelle veut accéder le visiteur (et, donc, le nom de l’hôte virtuel) n’est pas disponible tant que la connexion SSL n’a pas été établie.
La directive SSLFakeBasicAuth prétend que le client qui est connecté utilise l’authentification de base, mais donne le nom du certificat du client (une version de certificat d’une seule ligne, produite par la fonction X509_NAME_oneline() de SSLeay) au lieu du nom d’utilisateur, ainsi qu’un mot de passe fixe : password. Vous pouvez donc utiliser toutes les directives standard : Limit, Require, Satisfy.
Les ports 443 et 80 sont les ports par défaut pour les accès sécurisés ( https ) et non sécurisés ( http ), les visiteurs n’ont donc pas à le préciser. Vous auriez pu mettre les informations nécessaires à SSL ailleurs -- le certificat et la clé privée dans le répertoire .conf, par exemple, et gcache dans /usr/local/bin ou tout endroit de votre choix. Pour montrer qu’il n’y a pas d’astuce et que vous pouvez utiliser SSL avec n’importe quel site web, les racines des documents sont dans site.virtual. Pour éviter les complications avec les certificats des clients, nous précisons :
SSLVerifyClient 0
Cette directive chiffre les mots de passe dans une connexion HTTPS et corrige donc l’horrible défaut de l’authentification de base, dans laquelle les mots de passe circulent en clair.
N’oubliez pas de modifier le script go pour qu’il appelle httpsd (le serveur sécurisé) ; sinon, Apache rejetterait assez curieusement toutes les nouvelles directives SSL :
% httpsd -d /usr/www/APACHE3/site.ssl
Lors de son lancement, Apache produira un message :
Reading key for server sales.butterthlies.com:443
Launching... /usr/www/apache/apache_1.3.19/src/modules/sslgcache
pid=68598
Le pid désigne gcache, pas httpsd. Ce message montre que tout se passe bien : si vous aviez opté pour une phrase d’authentification, Apache vous aurait laissé la saisir, ce qui n’est pas le cas ici. Du côté client, connectez-vous à http://www.butterthlies.com : le site des cartes postales devrait apparaître comme à l’accoutumée. Si vous vous connectez à https://sales.butterthlies.com, il vous sera demandé un nom d’utilisateur et un mot de passe, comme d’habitude : sonia et voleur feront l’affaire.
Rappelez-vous du « s » dans https. Il peut sembler bizarre que le client doive savoir à l’avance qu’il va rencontrer un serveur SSL et qu’il doit s’y connecter en utilisant un protocole sécurisé mais, en pratique, vous vous connecterez sur un site non sécurisé avec http, puis vous choisirez ou serez conduit vers un lien qui mettra automatiquement en place la transaction sécurisée.
Si vous oubliez le « s » de https, plusieurs choses peuvent se produire :
- On vous indique que la page ne contient aucune donnée.
- Votre navigateur se fige.
- .site.ssl/apache_1.3/logs/error_log contient la ligne suivante :
SSL_Accept failed error:140760EB:SSL routines:SSL23_GET_CLIENT_HELLO:unknown
protocol
Si vous évitez tous ces écueils, vous pouvez vous dire que l’équipe de développement de votre navigateur a bien travaillé, puis vous passez par une tripotée de mises en garde juridiques et de questions de type « Êtes-vous absolument sûr ? » avant d’être enfin autorisé à consulter la page sécurisée.
Nous avons utilisé la directive SSLVerifyClient 0 pour qu’Apache ne s’inquiète pas de notre crédibilité en tant que client. Si vous la modifiez pour utiliser la valeur 2, cela forcera le client à présenter un certificat valide. Netscape indiquerait alors :
No User Certificate
The site 'www.butterthlies.com' has requested client authentication, but you
do not have a Personal Certificate to authenticate yourself. The site may
choose not to give you access without one.
Quelle honte ! Le moyen le plus simple de laver cet affront consiste à obtenir un certificat personnel auprès de l’une des sociétés que nous mentionnons plus loin.
Variables d’environnement
Lorsque Apache SSL est installé, un certain nombre de nouvelles variables d’environnement feront leur apparition et pourront être utilisées dans des scripts CGI (voir le chapitre 13). Le tableau 11-1 en dresse la liste.
Variables d’environnement d’Apache 1.3
Variable |
Type |
Description |
---|---|---|
HTTPS |
indicateur |
HTTPS est utilisé. |
HTTPS_CIPHER |
Chaîne |
Spécification du chiffrement SSL/TLS. |
SSL_CIPHER |
Chaîne |
Comme HTTPS_CIPHER. |
SSL_PROTOCOL_VERSION |
Chaîne |
Version du protocole SSL. |
SSL_SSLEAY_VERSION |
Chaîne |
Version de SSL_SSLEAY. |
HTTPS_KEYSIZE |
Valeur entière |
Nombre de bits de la clé de session. |
HTTPS_SECRETKEYSIZE |
Valeur entière |
Nombre de bits de la clé secrète. |
SSL_CLIENT_DN |
Chaîne |
Nom du certificat du client. |
SSL_CLIENT_ x509 |
Chaîne |
Composante du nom du certificat du client, où x509 est une partie d’un nom X509. |
SSL_CLIENT_I_DN |
Chaîne |
Nom de l’émetteur du certificat du client. |
SSL_CLIENT_I_ x509 |
Chaîne |
Composante du nom de l’émetteur du certificat du client, où x509 est une partie d’un nom X509. |
SSL_SERVER_DN |
Chaîne |
Nom du certificat du serveur. |
SSL_SERVER_ x509 |
Chaîne |
Composante du nom du certificat du serveur, où x509 est une partie d’un nom X509. |
SSL_SERVER_I_DN |
Chaîne |
Nom de l’émetteur du certificat du serveur. |
SSL_SERVER_I_ x509 |
Chaîne |
Composante du nom de l’émetteur du certificat du serveur, où x509 est une partie d’un nom X509. |
SSL_CLIENT_CERT |
Chaîne |
Encodage Base64 du certificat du client. |
SSL_CLIENT_CERT_CHAIN_ n |
Chaîne |
Encodage Base64 de la chaîne de certificats du client. |
mod_ssl et Apache 1.3
L’autre solution SSL pour Apache 1.3 consiste à utiliser mod-ssl. Vous trouverez une excellente introduction à SSL sur la page http://www.modssl.org/docs/2.8/ssl_intro.html.
Vous devez récupérer une archive mod_ssl correspondant à votre version d’Apache 1.3 -- 1.3.27 ici : téléchargez-la à partir de http://www.modssl.org/. Vous aurez également besoin de openssl ( http://www.openssl.org/ ) et, si vous souhaitez utiliser un cache de session en RAM plutôt que sur disque, de la bibliothèque OSSP mm pour la mémoire partagée ( http://www.engelschall.com/sw/mm/ ). Nous avons copié chacune de ces archives dans des répertoires distincts sous /usr/src. Perl et gzip doivent aussi être présents, mais nous supposons que c’est le cas.
Décompressez l’archive mod_ssl :
gunzip mod_ssl-2.8.14-1.3.27.tar.gz
puis extrayez le contenu du fichier .tar :
tar xvf mod_ssl-2.8.14-1.3.27.tar
Faites la même chose pour les autres archives. Revenez dans le répertoire .mod_ssl/mod_ssl-<date>-<version>, et lisez le fichier INSTALL.
Commencez par configurer et compiler la bibliothèque OpenSSL. Allez dans le répertoire et tapez la commande suivante en respectant bien les majuscules :
sh config no-idea no-threads -fPIC
Cela doit créer un fichier makefile approprié à votre environnement Unix. Puis, faites :
make
make test
Cela peut prendre un certain temps... Pour être complets, nous avons ensuite installé mm :
cd ....mm/mm-1.3.0
./configure --prefix=/usr/src/mm/mm-1.3.0
make
make test
make install
Il est maintenant temps de revenir dans le répertoire mod_ssl. Le fichier INSTALL contient une foule de conseils et de mises en garde et présente un grand nombre de procédures différentes. Nous ne décrirons ici qu’une compilation absolument minimale -- elle n’utilise même pas mm. Utilisez les options de configuration correspondant à votre schéma de répertoire. Le symbole \ signale que la ligne suivante fait partie de la même ligne physique :
./configure --with-apache=/usr/src/apache/apache_1.3.27 \
--with-ssl=/usr/src/openssl/openssl-0.9.7a \
--prefix=/usr/local
Cela configure mod_ssl pour la version d’Apache indiquée et configure également Apache. Le script se termine par les instructions suivantes :
Now proceed with the following ncommands:
$ cd /usr/src/apache/apache_1.3.27
$ make
$ make certificate
Ce processus produit un certificat exemple. Pour cela, il vous sera demandé s’il doit contenir des ingrédients de chiffrement RSA ou DSA : répondez « R » (pour RSA, qui est le chiffrement par défaut) car aucun navigateur ne reconnaît DSA. On vous demandera ensuite de fournir d’autres informations. Comme il ne s’agit pas d’un vrai certificat, ce que vous saisirez n’a pas grande importance. Comme la plupart des questions ont des réponses par défaut, contentez-vous de faire Entrée :
1. Country Name (2 letter code) [XY]:
....
Vous devrez fournir une phrase d’authentification PEM -- qui peut être n’importe laquelle, pourvu que vous en vous en rappeliez. Cela a pour effet de produire les fichiers suivants :
.conf/ssl.key/server.key
Contient votre clé privée.
.conf/ssl.crt/server.crt
Contient votre certificat X.509.
.conf/ssl.csr/server.csr
Contient la demande de signature de certificat X.509 encodée par PEM, que vous pouvez envoyer à une CA pour obtenir un vrai certificat de serveur qui remplacera .conf/ssl.crt/server.crt
Faites :
make install
Cela produit un bel écran contenant les lignes suivantes :
## SSL Global Context
##
## All SSL configuration in this context applies both to
## the main server and all SSL-enabled virtual hosts.
##
#
# Some MIME-types for downloading Certificates and CRLs
#
<IfDefine SSL>
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl .crl
</IfDefine>
<IfModule mod_ssl.c>
# Pass Phrase Dialog:
# Configure the pass phrase gathering process.
# The filtering dialog program ('builtin' is a internal
# terminal dialog) has to provide the pass phrase on stdout.
SSLPassPhraseDialog builtin
# Inter-Process Session Cache:
# Configure the SSL Session Cache: First the mechanism
# to use and second the expiring timeout (in seconds).
#SSLSessionCache none
#SSLSessionCache shmht:/usr/local/sbin/logs/ssl_scache(512000)
#SSLSessionCache shmcb:/usr/local/sbin/logs/ssl_scache(512000)
SSLSessionCache dbm:/usr/local/sbin/logs/ssl_scache
SSLSessionCacheTimeout 300
Pour utiliser mod_ssl, vous devrez incorporer des lignes identiques à celles-ci dans vos propres fichiers de configuration. Vous pouvez tester que le nouvel Apache fonctionne en allant dans /usr/src/bin et en lançant :
./apachectl startssl
N’oubliez pas le ./ où vous lancerez un autre apachectl, qui ne fonctionnera sûrement pas.
Les directives sont les mêmes que pour le SSL d’Apache 2, que nous décrivons maintenant.
SSL et Apache 2
SSL pour Apache 2 est plus simple car il n’y a qu’un seul choix. Téléchargez OpenSSL comme nous venons de le décrire puis revenez dans le répertoire des sources d’Apache et supprimez-les toutes. Notre /usr/src/apache, contenait l’archive httpd-2_0_28-beta.tar et le répertoire httpd-2_0_28. Nous avons supprimé ce répertoire puis l’avons recréé en faisant :
rm -r httpd-2_0_28
tar xvf httpd-2_0_28-beta.tar
cd httpd-2_0_28
Pour recompiler Apache avec SSL :
./configure --with-layout=GNU --enable-ssl
--with-ssl=<chemin vers les sources ssl> --prefix=/usr/local
make
make install
Cette commande produit un exécutable httpd (et non httpsd, comme avec Apache 1.3) dans le sous-répertoire bin du chemin précisé par l’option --prefix.
Vous trouverez des FAQ utiles et très bien faites aux URL httpd.apache.org/docs-2.0/ssl/ssl_faq.html et www.openssl.org.faq.html.
Fichier de configuration
Un fichier de configuration équivalent à celui que nous avons présenté plus haut se trouve dans le répertoire ...site.ssl/apache_2 :
User webuser
Group webgroup
LogLevel notice
LogFormat "%h %l %t \"%r\" %s %b %a %{user-agent}i %U" sidney
#SSLCacheServerPort 1234
#SSLCacheServerPath /usr/src/apache/apache_1.3.19/src/modules/ssl/gcache
SSLSessionCache dbm:/usr/src/apache/apache_1.3.19/src/modules/ssl/gcache
SSLCertificateFile /usr/src/apache/apache_1.3.19/SSLconf/conf/new1.cert.cert
SSLCertificateKeyFile /usr/src/apache/apache_1.3.19/SSLconf/conf/privkey.pem
SSLVerifyClient 0
SSLSessionCacheTimeout 3600
Listen 192.168.123.2:80
Listen 192.168.123.2:443
<VirtualHost 192.168.123.2:80>
SSLEngine off ServerName www.butterthlies.com
DocumentRoot /usr/www/APACHE3/site.virtual/htdocs/customers
ErrorLog /usr/www/APACHE3/site.ssl/apache_2/logs/error_log
CustomLog /usr/www/APACHE3/site.ssl/apache_2/logs/butterthlies_log sidney
</VirtualHost>
<VirtualHost 192.168.123.2:443>
SSLEngine on
ServerName sales.butterthlies.com
DocumentRoot /usr/www/APACHE3/site.virtual/htdocs/salesmen
ErrorLog /usr/www/APACHE3/site.ssl/apache_2/logs/error_log
CustomLog /usr/www/APACHE3/site.ssl/apache_2/logs/butterthlies_log sidney
<Directory /usr/www/APACHE3/site.virtual/htdocs/salesmen>
AuthType Basic
AuthName darkness
AuthUserFile /usr/www/APACHE3/ok_users/sales
AuthGroupFile /usr/www/APACHE3/ok_users/groups
Require group cleaners
</Directory>
</VirtualHost>
Il est assez ennuyeux de devoir changer quelques directives mais, en pratique, on ne passe pas d’une version d’Apache à l’autre tous les jours...
Le seul problème est que si l’on avait mis SSLSessionCache à none (ce qui est sa valeur par défaut), ou si on l’avait totalement occultée, le navigateur ne pouvait pas trouver le serveur. Configurée comme on l’a montré plus haut, tout fonctionne bien.
Variables d’environnement
Ce module fournit de nombreuses informations SSL sous la forme de variables d’environnement supplémentaires, qui peuvent être utilisées par SSI et CGI. Ces variables sont énumérées dans le tableau 11-2. Pour des raisons de compatibilité ascendante, ces informations peuvent également être désignées par d’autres noms.
Variables d’environnement Apache 2
Variable |
Type |
Description |
---|---|---|
HTTPS |
Indicateur |
Indique si HTTPS est utilisé. |
SSL_PROTOCOL |
Chaîne |
Version du protocole SSL (SSL v2, SSL v3, TLS v1) |
SSL_SESSION_ID |
Chaîne |
Identifiant de session SSL encodé en hexadécimal. |
SSL_CIPHER |
Chaîne |
Nom de la spécification du chiffrement. |
SSL_CIPHER_EXPORT |
Chaîne |
Vrai si le chiffrement est un chiffrement d’exportation ( export cipher ). |
SSL_CIPHER_USEKEYSIZE |
Valeur entière |
Nombre de bits de chiffrement réllement utilisés. |
SLL_CIPHER_ALGKEYSIZE |
Valeur entière |
Nombre de bits de chiffrement possible. |
SSL_VERSION_INTERFACE |
Chaîne |
Version de mod_ssl. |
SSL_VERSION_LIBRARY |
Chaîne |
Version de OpenSSL. |
SSL_CLIENT_M_VERSION |
Chaîne |
Version du certificat du client. |
SSL_CLIENT_M_SERIAL |
Chaîne |
Numéro de série du certificat du client. |
SSL_CLIENT_S_DN |
Chaîne |
Nom du sujet du certificat du client. |
SSL_CLIENT_S_DN_ x509 |
Chaîne |
Composante du nom du sujet du certificat du client, où x509 est une partie d’un nom X509. |
SSL_CLIENT_I_DN |
Chaîne |
Nom de l’émetteur du certificat du client. |
SSL_CLIENT_I_DN_ x509 |
Chaîne |
Composante du nom de l’émetteur du certificat du client, où x509 est une partie d’un nom X509. |
SSL_CLIENT_V_START |
Chaîne |
Validité du certificat du client (date de début). |
SSL_CLIENT_V_END |
Chaîne |
Validité du certificat du client (date de fin). |
SSL_CLIENT_A_SIG |
Chaîne |
Algorithme utilisé pour la signature du certificat du client. |
SSL_CLIENT_A_KEY |
Chaîne |
Algorithme utilisé pour la clé publique du certificat du client. |
SSL_CLIENT_CERT |
Chaîne |
Certificat du client encodé par PEM. |
SSL_CLIENT_CERT_CHAIN n |
Chaîne |
Certificats de la chaîne de certificats du client encodés par PEM. |
SSL_CLIENT_VERIFY |
Chaîne |
NONE, SUCCESS, GENEROUS, ou FAILED : raison |
SSL_SERVER_M_VERSION |
Chaîne |
Version du certificat du serveur. |
SSL_SERVER_M_SERIAL |
Chaîne |
Numéro de série du certificat du serveur. |
SSL_SERVER_S_DN |
Chaîne |
Nom du sujet du certificat du serveur. |
SSL_SERVER_S_DN_ x509 |
Chaîne |
Composante du nom du sujet du certificat du serveur, où x509 est une partie d’un nom X509. |
SSL_SERVER_I_DN |
Chaîne |
Nom de l’émetteur du certificat du serveur. |
SSL_SERVER_I_DN_ x509 |
Chaîne |
Composante du nom de l’émetteur du certificat du serveur, où x509 est une partie d’un nom X509. |
SSL_SERVER_V_START |
Chaîne |
Validité du certificat du serveur (date de début). |
SSL_SERVER_V_END |
Chaîne |
Validité du certificat du serveur (date de fin). |
SSL_SERVER_A_SIG |
Chaîne |
Algorithme utilisé pour la signature du certificat du serveur. |
SSL_SERVER_A_KEY |
Chaîne |
Algorithme utilisé pour la clé publique du certificat du serveur. |
SSL_SERVER_CERT |
Chaîne |
Certificat du serveur encodé par PEM. |
Création d’un certificat de test
Quelle que soit la version d’Apache que vous utilisez, vous avez maintenant besoin d’un certificat de test. Allez dans le répertoire .src et faites :
% make certificate
Il vous sera posé plusieurs questions sur votre identité et votre résidence :
ps > /tmp/ssl-rand; date >> /tmp/ssl-rand; RANDFILE=/tmp/ssl-rand
/usr/local/ssl/bin/openssl req -config SSLconf/conf/ssleay.cnf -new
-x509 -nodes -out SSLconf/conf/httpsd.pem -keyout
SSLconf/conf/httpsd.pem; ln -sf httpsd.pem
SSLconf/conf/'/usr/local/ssl/bin/openssl x509 -noout -hash < SSLconf/conf/httpsd.pem'.0; rm /tmp/ssl-rand
Using configuration from SSLconf/conf/ssleay.cnf
Generating a 1024 bit RSA private key
...........++++++ .
.........++++++
writing new private key to 'SSLconf/conf/httpsd.pem'
-----
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) [GB]: US
State or Province Name (full name) [Some-State]: Nevada
Locality Name (eg, city) []: Hopeful City
Organization Name (eg, company; recommended) []: Butterthlies Inc
Organizational Unit Name (eg, section) []: Sales
server name (eg. ssl.domain.tld; required!!!) []: sales.butterthlies.com
Email Address []: sales@butterthlies.com
Les saisies de l’utilisateur sont représentées en gras. La seule qui compte vraiment est « server name », qui doit être le nom pleinement qualifié de votre serveur. Cette information doit être correcte car les navigateurs soucieux de sécurité vérifieront que cette adresse est la même que celle à laquelle ils accèdent. Pour vérifier le résultat, allez dans le répertoire .SSLConf/conf et ouvrez le fichier httpsd.pem, qui doit contenir des lignes comme celles-ci (les vôtres seront différentes, bien sûr) :
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDBpDjpJQxvcPRdhNOflTOCyQp1Dhg0kBruGAHiwxYYHdlM/z6k pi8EJFvvkoYdesTVzM+6iABQbk9fzvnG5apxy8aB+byoKZ575ce2Rg43i3KNTXY+
RXUzy/5HIiL0JtX/oCESGKt5W/xd8G/xoKR5Qe0P+1hgjASF2p97NUhtOQIDAQAB AoGALIh4DiZXFcoEaP2DLdBCaHGT1hfHuU7q4pbi2CPFkQZMU0jgPz140psKCa7I 6T6yxfi0TVG5wMWdu4r+Jp/q8ppQ94MUB5oOKSb/Kv2vsZ+T0ZCBnpzt1eia9ypX ELTZhngFGkuq7mHNGlMyviIcq6Qct+gxd9omPsd53W0th4ECQQDmyHpqrrtaVlw8 aGXbTzlXp14Bq5RG9Ro1eibhXId3sHkIKFKDAUEjzkMGzUm7Y7DLbCOD/hdFV6V+ pjwCvNgDAkEA1szPPD4eB/tuqCTZ+2nxcR6YqpUkT9FPBAV9Gwe7Svbct0yu/nny bpv2fcurWJGI23UIpWScyBEBR/z34El3EwJBALdw8YVtIHT9IlHN9fCt93mKCrov JSyF1PBfCRqnTvK/bmUij/ub+qg4YqS8dvghlL0NVumrBdpTgbO69QaEDvsCQDVe
P6MNH/MFwnGeblZr9SQQ4QeI9LOsIoCySGod2qf+e8pDEDuD2vsmXvDUWKcxyZoV
Eufc/qMqrnHPZVrhhecCQCsP6nb5Aku2dbhX+TdYQZZDoRE2mkykjWdK+B22C2/4 C5VTb4CUF7d6ukDVMT2d0/SiAVHBEI2dR8Vw0G7hJPY=
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE----- MIICvTCCAiYCAQAwDQYJKoZIhvcNAQEEBQAwgaYxCzAJBgNVBAYTAlVTMQ8wDQYD VQQIEwZOZXZhZGExFTATBgNVBAcTDEhvcGVmdWwgQ2l0eTEZMBcGA1UEChMQQnV0 dGVydGhsaWVzIEluYzEOMAwGA1UECxMFU2FsZXMxHTAbBgNVBAMTFHd3dy5idXR0 ZXJ0aGxpZXMuY29tMSUwIwYJKoZIhvcNAQkBFhZzYWxlc0BidXR0ZXJ0aGxpZXMu Y29tMB4XDTk4MDgyNjExNDUwNFoXDTk4MDkyNTExNDUwNFowgaYxCzAJBgNVBAYT AlVTMQ8wDQYDVQQIEwZOZXZhZGExFTATBgNVBAcTDEhvcGVmdWwgQ2l0eTEZMBcG A1UEChMQQnV0dGVydGhsaWVzIEluYzEOMAwGA1UECxMFU2FsZXMxHTAbBgNVBAMT FHd3dy5idXR0ZXJ0aGxpZXMuY29tMSUwIwYJKoZIhvcNAQkBFhZzYWxlc0BidXR0 ZXJ0aGxpZXMuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDBpDjpJQxv cPRdhNOflTOCyQp1Dhg0kBruGAHiwxYYHdlM/z6kpi8EJFvvkoYdesTVzM+6iABQ bk9fzvnG5apxy8aB+byoKZ575ce2Rg43i3KNTXY+RXUzy/5HIiL0JtX/oCESGKt5
W/xd8G/xoKR5Qe0P+1hgjASF2p97NUhtOQIDAQABMA0GCSqGSIb3DQEBBAUAA4GB
AIrQjOfQTeOHXBS+zcXy9OWpgcfyxI5GQBg6VWlRlhthEtYDSdyNq9hrAT/TGUwd
Jm/whjGLtD7wPx6c0mR/xsoWWoEVa2hIQJhDlwmnXk1F3M55ZA3Cfg0/qb8smeTx
7kM1LoxQjZL0bg61Av3WG/TtuGqYshpE09eu77ANLngp
-----END CERTIFICATE-----
Il s’agit d’un certificat plutôt atypique car il combine votre clé privée avec le certificat ; vous préférerez sûrement les séparer et n’autoriser la lecture de la clé privée qu’à root (voir plus loin). De plus, ce certificat est signé par nous-même, ce qui en fait un certificat émanant d’une autorité de certification d’origine : c’est uniquement pour simplifier les tests car, en pratique, les CA d’origine sont des organisations plus impressionnantes que nous. Cependant, ce certificat est fonctionnellement identique à un vrai : la différence importante est qu’il est moins cher et plus rapide à obtenir qu’un vrai.
Ce certificat n’a pas de phrase d’authentification, sinon httpsd la demanderait au démarrage. Nous pensons qu’une telle phrase est une mauvaise idée car elle empêche les redémarrages automatiques du serveur mais, si vous voulez créer un certificat qui en comporte une, modifiez le fichier Makefile (n’oubliez pas de le re-modifier si vous relancez Configuration ), ôtez l’indicateur -nodes de la section certificate: et recommencez l’opération décrite ci-dessus. Vous pouvez également suivre la procédure suivante, qui servira aussi lorsque l’on demandera un vrai certificat à l’une des CA que nous présenterons plus loin. Allez dans le répertoire .SSLConf/conf et tapez la commande suivante :
% openssl req -new -outform PEM> new.cert.csr
...
writing new private key to 'privkey.pem'
enter PEM pass phrase:
Saisissez votre phrase d’authentification puis répondez aux questions comme précédemment. Il vous sera également demandé de fournir un mot de passe défi -- nous avons utilisé « swan ». Cela produira un CSR ( Certificate Signing Request ) contenant votre phrase chiffrée à l’aide de votre clé privée, ainsi que les informations que vous avez fournies sur votre identité et votre lieu de résidence. Vous en aurez besoin lorsque vous demanderez un certificat de serveur. Envoyez-la à la CA de votre choix : si elle réussit à la déchiffrer avec votre clé publique, elle peut continuer à contrôler -- plus ou moins minutieusement -- que vous êtes bien celui que vous prétendez être.
Cependant, si vous décidez que vous ne voulez pas utiliser de phrase d’authentification car cela complique le démarrage d’Apache, vous pouvez la supprimer avec cette commande :
% openssl rsa -in privkey.pem -out privkey.pem
Vous devrez, bien sûr, entrer votre phrase d’authentification une dernière fois. Dans les deux cas, vous devez ensuite convertir cette requête en un certificat signé :
% openssl x509 -in new1.cert.csr -out new1.cert.cert -req -signkey privkey.pem
Comme nous l’avons déjà fait remarquer, il est prudent de n’autoriser la lecture de ce fichier qu’à root :
% chmod u=r,go= privkey.pem
Vous disposez maintenant d’une version sécurisée d’Apache ( httpsd ), d’un certificat ( new1.cert.cert ), d’un CSR ( new1.cert.csr ) et d’une clé signée ( privkey.pem ).
Obtenir un certificat de serveur
Si vous souhaiter disposer d’un certificat plus convaincant que celui que nous venons de créer, vous devez vous rendre sur l’une des URL suivantes :
Revendeurs de http://resellers.tucows.com/products/.
Thawte Consulting, http://www.thawte.com/certs/server/request.html.
CertiSign Certificadora Digital Ltda., http://www.certisign.com.br.
IKS GmbH, http://www.iks-jena.de/produkte/ca/.
BelSign NV/SA, http://www.belsign.be.
Verisign, Inc., http://www.verisign.com/guide/apache.
TC TrustCenter (Allemagne), http://www.trustcenter.de/html/Produkte/TC_Server /855.htm.
NLsign B.V., http://www.nlsign.nl.
Deutsches Forschungsnetz, http://www.pca.dfn.de/dfnpca/certify/ssl/.
128i Ltd. (Nouvelle Zélande), http://www.128i.com.
Entrust.net Ltd., http://www.entrust.net/products/index.htm.
Equifax Inc., http://www.equifaxsecure.com/ebusinessid/.
GlobalSign NV/SA, http://www.GlobalSign.net.
NetLock Kft. (Hongrie), http://www.netlock.net.
Certplus SA (France), http://www.certplus.com.
Toutes ces CA peuvent avoir des procédures légèrement différentes car il n’existe pas de format standard pour les CSR. Nous vous conseillons de vous renseigner sur les exigences d’une CA avant de vous lancer dans l’achat d’un certificat.
Le cache global de session
SSL utilise une clé de session pour sécuriser chaque connexion. Au départ de la connexion, les certificats sont contrôlés et une nouvelle clé de session est négociée entre le client et le serveur (à cause des joies du chiffrement par clé publique, cette nouvelle clé n’est connue que du client et du serveur). Il s’agit d’un processus qui prend du temps : par conséquent, Apache-SSL et le client peuvent s’entendre pour améliorer cette situation en réutilisant des clés de session. Malheureusement, comme Apache utilise un modèle d’exécution multi-processus, il n’est pas garanti que la prochaine connexion du client utilisera la même instance du serveur ; en fait, c’est même peu probable. Par conséquent, il est nécessaire de stocker les informations de session dans un cache accessible à toutes les instances d’Apache-SSL : c’est le rôle du programme gcache, qui est contrôlé par les directives SSLCacheServerPath, SSLCacheServerPort, SSLSessionCacheTimeout d’Apache 1.3 et SSLSessionCache d’Apache 2.