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:// !
© 2003 Yves Mettier