Copyright © 2003 Yves Mettier
L'article original se trouve sur http://ymettier.free.fr/articles_lmag/.
Article publié dans le numéro 53 (septembre 2003) de GNU/Linux France Magazine
Table des matières
Installez Apache, PHP, et configurez le serveur pour qu'il sache discuter le protocole https. Cet article traite de trois sujets distincts, et pourrait en devenir très long. L'objectif de cet article est au contraire d'être concis, le plus court possible mais de rassembler les trois sujets. Vous aurez ainsi une vue d'ensemble, et vous pourrez ensuite approfondir le sujet avec d'autres articles plus précis et ciblés déjà parus, ou la documentation abondante sur internet.
Nous allons installer plusieurs logiciels après les avoir compilés nous-mêmes. L'installation, pour être un minimum maintenable suivra quelques règles facilitant cette maintenance. Ainsi nous allons tout installer dans /opt. L'arborescence sera la suivante, pour chaque logiciel: /opt/logiciel/logiciel-${version}. Dans ce répertoire nous installons le logiciel. Et un lien /opt/logiciel/logiciel pointera sur /opt/logiciel/logiciel-${version}. En pratique, nous aurons: /opt/httpd/httpd qui pointera sur /opt/httpd/httpd-2.0.47. Cela permet de faire cohabiter la version courante ainsi que des versions antérieures. Cela permet aussi de simplement supprimer une version, à coup de rm -rf.
Le serveur web que nous installons est apache. Mais c'est la version 2.0 que nous installons, car si la version 1.3 a fait ses preuves, elle doit cependant être remplacée par la 2.0, qui améliore les performances et le nombre de possibilités. Récupérez une archive sur un miroir, décompressez-la, et lancez la commande habituelle:
$ ./configure --prefix=/opt/httpd/httpd-2.0.47 --enable-so --enable-ssl $ make $ make install
Je passe l'option prefix dont vous devinez le rôle si vous ne le connaissez pas. L'option --enable-so permet d'activer la fonctionnalité des modules dynamiquement chargeables d'apache. Elle est nécessaire pour l'installation de PHP telle nous allons la faire, à savoir en tant que module dynamique. Et l'option --enable-ssl active la capacité d'apache à comprendre le https. Le reste ne nécessite pas d'explications.
Si vous ne connaissez pas apache, le fichier de configuration est /opt/httpd/httpd/conf/httpd.conf (je suppose que vous avez fait le lien httpd pointant sur httpd-2.0.47). A priori, vous pouvez lancer apache sans modification de ce fichier. Cependant, je vous suggère de déplacer les répertoires htdocs, cgi-bin et icons (du répertoire /opt/httpd/httpd) dans /opt/httpd/html ou tout autre répertoire indépendant de la version d'apache. Et modifiez le fichier httpd.conf en conséquence. Ne faites pas trop d'autres modifications pour l'instant, nous ne sommes qu'en phase de test.
Pour faire du https, nous utilisons ssl, et avons besoin de certificats. Le principe est d'avoir un certificat. Pour cela, on génère un certificat à signer, un CSR (Certificate Signing Request). Une entité tierce qui aura connaissance de votre clef, va le signer, et vous donner le certificat réel (CRT). Cette entité est une Autorité de Certification (CA: Certificate Authority). Si vous n'avez pas besoin d'un tel niveau de sécurité, comme souvent sur un intranet, vous pouvez vous permettre de jouer le rôle de l'entité tierce, ce que nous allons faire ci-dessous. Sur Internet, cela n'est pas très conseillé et il vaut mieux passer par une CA de confiance et lui donner votre CSR à signer.
Une petite remarque concernant mod_ssl si vous en avez entendu parler, mais que vous ne me voyez pas en parler: mod_ssl est un module séparé pour apache-1.3. Mais en 2001, il a été intégré à la branche 2.0 d'Apache, c'est pourquoi vous n'avez pas besoin d'aller sur le site web de mod_ssl pour récupérer ce module.
Nous allons maintenant travailler dans le répertoire /opt/httpd/httpd/conf et créer une clef pour le serveur:
$ mkdir ssl.key $ cd ssl.key $ openssl genrsa -des3 -out server.key 1024 $ openssl rsa -in server.key -out server.key.unsecure $ mv server.key server.key.encrypted $ mv server.key.unsecure server.key $ cd ..
Ceci crée une clef RSA pour le serveur, avec la commande openssl genrsa. Puis avec openssl rsa ligne suivante, nous supprimons le mot de passe, raison pour laquelle le nom de la clef générée contient unsecure. Pour plus d'informations: man rsa
Créons ensuite un certificat (CSR):
$ mkdir ssl.csr $ cd ssl.csr $ openssl req -new -key ../ssl.key/server.key.encrypted -out server.csr $ cd ..
Des questions vont vous être posées. Vous pouvez mettre les informations que vous voulez: ce seront celles qui seront affichées lorsque vous voudrez visualiser votre certificat, par exemple quand votre navigateur vous le proposera. Vous pouvez mettre les informations que vous voulez sauf une: le Common Name. Ici, vous devez mettre le nom de votre serveur, par exemple www.monserveur.org, ou monserveur.dyndns.org, enfin bref, vous avez compris, c'est le nom de votre serveur, qui fait partie de l'URL, après https:// et avant le chemin absolu de la page. Rien de plus à commenter ici. Pour plus d'informations, man req. Et nous avons maintenant notre clef et notre certificat.
Maintenant que vous avez votre CSR, vous pouvez l'envoyer à une CA. Si vous décider d'auto-signer votre certificat, jouant vous-même le rôle de la CA, voici la marche à suivre. D'abord, générons une clef, exactement comme nous l'avons fait plus haut, avant de générer le certificat.
$ cd ssl.key $ openssl genrsa -des3 -out ca.key 1024 $ openssl rsa -in ca.key -out ca.key.unsecure $ mv ca.key ca.key.encrypted $ mv ca.key.unsecure ca.key $ cd ..
Attention, pour la suite, la clef doit s'appeler ca.key et pas autrement, sous peine de complications.
Ensuite, créons un certificat x.509. Ici aussi, sous peine de complications, le certificat doit s'appeler ca.crt et pas autrement.
$ mkdir ssl.crt $ cd ssl.crt $ openssl req -new -x509 -days 2002 -key ../ssl.key/ca.key.encrypted -out ca.crt $ cd ..
Ici à nouveau, on vous pose des questions. A nouveau, rentrez ce que vous voulez, sachant que ce sont les données correspondant à la CA. Mais le nom du Common Name doit être différent de celui que vous avez donné pour la clef. Cela est évident car même si vous auto-authentifiez votre certificat, vous devez néanmoins simuler que vous êtes quelqu'un d'autre pour le faire !
Enfin, il n'y a plus qu'à signer le certificat server.csr, ce qui va donner un fichier server.crt, puisque vous avez voulu le faire vous-même au lieu de laisser une CA le faire pour vous:
$ mkdir tmp $ cd tmp $ cp ../ssl.key/*key . $ cp ../ssl.crt/ca.crt . $ cp ../ssl.csr/server.csr . $ sh sign.sh server.csr $ mv server.crt ../ssl.crt/ $ cd ..
Le script sign.sh se trouve relativement facilement sur internet. Je vous conseille néanmoins d'utiliser celui des sources de mod_ssl que vous obtenez depuis http://www.modssl.org. Il se trouve dans le répertoire pkg.contrib des sources. C'est à cause de ce script que vous devez avoir une clef nommée ca.key et un certificat nommé ca.crt.
Il reste à faire un peu de ménage et à vérifier les permissions:
$ rm -rf tmp $ cd ssl.crt $ chmod 600 *
Apache n'est pas trop difficile à configurer pour supporter le protocole https. En effet, à l'installation d'apache, un fichier ssl-std.conf a normalement été installé dans le répertoire conf. Copiez-le en l'appelant ssl.conf, et éditez-le. Les modifications sont tout ce qu'il y a de plus normal pour votre serveur. Mettez par exemple le nom de votre machine à la place de new.host.name.
Deux lignes doivent être modifiées pour correspondre aux certificats. Ce sont les lignes SSLCertificateChainFile pour le chemin complet du ca.crt et SSLCACertificatePath pour celui du certificat ssl.crt. Si les choses sont bien faites, vous n'avez qu'à enlever le commentaire. Sinon, ces lignes sont:
SSLCertificateChainFile /opt/httpd/httpd/conf/ssl.crt/ca.crt SSLCACertificatePath /opt/httpd/httpd/conf/ssl.crt
Enfin, dans la configuration du serveur sécurisé, vous utilisez la même arborescence que celle du serveur non sécurisé. Si vous avez l'intention de faire tourner les deux en même temps, je vous conseille d'avoir deux arborescences disjointes pour vos documents web, ainsi que deux logs distinctes, si vos besoins l'exigent. Cela se fait en modifiant la directive DocumentRoot ainsi que ErrorLog et TransferLog, et en rajoutant des permissions pour le répertoire DocumentRoot avec <Directory chemin>...</Directory>. Voyez la documentation d'Apache pour cela, ou inspirez-vous de ce qui est dans httpd.conf.
Pour lancer apache afin qu'il reconnaisse le protocole https, allez dans /opt/httpd/httpd/bin: vous devriez avoir, en plus du script apachectl, un autre script apachectl-ssl qu'il suffit de lancer comme vous l'avez fait pour apachectl plus haut:
$ apachectl-ssl start
Il est possible aussi comme c'est le cas avec la version 2.0.47 que vous n'ayez pas ce script. Alors, tout est intégré au script apachectl, et vous devez alors lancer:
$ apachectl startssl
Rendez-vous ensuite sur votre serveur, mais avec une URL en https:// au lieu de http:// !
Pour avoir l'installation http+https+php, il ne manque plus que php. Récupérez-le et décompressez-le. Voici une ligne de configuration avec les options de compilation qui vont activer les fonctionnalités ssl, compression avec zlib et bzip2, avec le support des images jpg, png et xpm et la possibilité de dessiner avec gd, avec gettext, avec imap et imap-ssl, et avec dom pour le XML. Libre à vous de rajouter d'autres options ou d'en supprimer parmi celles que j'ai mises. Voici la ligne, suivie de l'inévitable séquence make et make install:
$ ./configure --prefix=/opt/httpd/php-4.3.2 --with-apxs2=/opt/httpd/httpd-2.0.47/bin/apxs --with-openssl --with-zlib --with-bz2 --with-jpeg-dir --with-dom --with-gd --with-png-dir --enable-gd-native-ttf --with-gettext --with-imap --with-imap-ssl --with-xpm-dir --with-gettext --enable-xml $ make $ make install
Pour que vos serveurs http et https soient capables de comprendre le php, vous devez rajouter ceci au fichier httpd.conf si ce n'est déjà fait:
LoadModule php4_module modules/libphp4.so AddType application/x-httpd-php php
Enfin, il ne vous reste plus qu'à arrêter et relancer vos deux serveurs web pour prendre en compte la modification.
J'ai essayé, dans cet article, d'aller au plus court, en supposant qu'Apache ne vous était pas tout à fait inconnu. Si tel était le cas et que vous avez lu jusqu'au bout, j'espère vous avoir donné envie d'approfondir le sujet avec la documentation abondante sur le sujet, dans les librairies et encore plus sur internet. Sinon, vous avez là un aide-mémoire sur l'installation d'un serveur web+php supportant le https sans trop de longueurs. Il ne vous reste plus qu'à installer vos applications web telles que imp ou squirrelmail pour le web, telles que phpgroupware, ou de nombreuses autres applications qui foisonnent sur le web !
Introduction à mod_ssl: http://httpd.apache.org/docs-2.0/ssl/ssl_intro.html
Documentation sur le module ssl d'Apache-2.0: http://httpd.apache.org/docs-2.0/mod/mod_ssl.html
mod_ssl: http://www.modssl.org
Génération des certificats: http://httpd.apache.org/docs-2.0/ssl/ssl_faq.html
La page de manuel d'openssl qui renvoie sur d'autres pages de manuel
Le site de PHP: http://www.php.net
© 2003 Yves Mettier