Déploiement SSL
SSL/TLS est une sous-couche applicative permettant la mise en place de tunnels chiffrés afin de sécuriser un traffic applicatif. Il est notamment très utilisé sur les serveurs Web pour assurer l'authentification du serveur, voire des clients, ainsi que le chiffrement des requêtes et des réponses.
SSL/TLS se base sur le déploiement de certificats pour assurer l'authenticité du serveur Web visité, et ainsi contrer les attaques de type phishing.
Cette page détail la manière de déployer SSL sur votre serveur, en s'appuyant sur une autorité de certification maison. Nous nous baserons ainsi sur l'utilisation d'openssl, un outil libre et embarqué avec la plupart des distributions UNIX qui permet la manipulation de mécanismes liés à SSL.
Sommaire |
Mise en place de l'autorité de certification
SSL se base sur une hiérarchie d'autorités de certification (CA - Certification Authorities) afin d'attester l'identité d'un site. Une autorité de certification est une entité qui crée et distribue des certificats. Dans le cas d'un site commercial ou professionnel, il est préférable d'utiliser des CA reconnues. Dans le cas d'un serveur "maison", d'un réseau local ou d'un site communautaire comme SoH, la création d'une CA suffit : les certificats utilisés par les serveurs seront validés par cette CA. Il suffit alors de demander à son navigateur de faire confiance à cette autorité "maison". Dans le cas de SoH, nous avons crée une CA nommée spiritofhackCA. C'est son déploiement que nous suivrons dans cette page.
La création d'une CA nécessite tout d'abord de générer une clé privée qui sera utilisée pour la signature des certificats :
SoH:~/CA# openssl genrsa -des3 -out spiritofhackCA.key 2048 Generating RSA private key, 2048 bit long modulus ...................+++ ...........................................................................................................................................+++ e is 65537 (0x10001) Enter pass phrase for spiritofhackCA.key: Verifying - Enter pass phrase for spiritofhackCA.key:
OpenSSL génére ainsi une clé privée RSA qu'il stocke dans le fichier spiritofhackCA.key. La passphrase utilisée pour la création est à conserver : elle sera demandée pour toute signature d'un certificat par notre CA.
Une fois la clé générée, nous créons un certificat X509 basé sur cette identité, le certificat crée sera stocké dans le fichier spiritofhackCA.crt. Etant donné que nous sommes très confiant en l'avenir, nous demandons à ce que le certificat soit valide pour 10 ans :
SoH:~/CA# openssl req -new -x509 -days 3650 -key spiritofhackCA.key -out spiritofhackCA.crt Enter pass phrase for spiritofhackCA.key: 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) [AU]:FR State or Province Name (full name) [Some-State]: Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]:Spirit Of Hack Organizational Unit Name (eg, section) []:Certification Authority Common Name (eg, YOUR name) []:SpiritOfHack Email Address []:contact@spiritofhack.net
Opnssl nous demande quelques informations sur le CA (localité, nom, etc), qui seront intégrées aux certificats. Une fois ce dernier créé, il est possible d'en vérifier le contenu grâce à la commande :
openssl x509 -in spiritofhackCA.crt -text -noout
Nous disposons maintenant d'une autorité de certification complète "maison", que nous pourrons utiliser pour signer les certificats utilisés sur les différents vhosts. Ainsi, le visiteur peut s'assurer que le site qu'il visite utilise un certificat signé par notre CA, et qu'il n'a donc par exemple pas été redirigé vers un serveur tiers.
Génération des certificats serveur
Notre autorité de certification doit servir à signer les certificats utilisés pour les serveurs SSL de nos différents vhosts (www.spiritofhack.net, forum.spiritofhack.net, wiki.spiritofhack.net). Il faut donc commencer par créer ces certificats, ce qui nécessite la génération d'une nouvelle clé privée RSA :
SoH:~/CA# openssl genrsa -des3 -out www.spiritofhack.net.key 1024 Generating RSA private key, 1024 bit long modulus ..........++++++ ...............................++++++ e is 65537 (0x10001) Enter pass phrase for www.spiritofhack.net.key: Verifying - Enter pass phrase for www.spiritofhack.net.key:
Nous utilisons ensuite la clé privée pour générer un certificat X509 :
SoH:~/CA# openssl req -new -key www.spiritofhack.net.key -out www.spiritofhack.net.csr Enter pass phrase for www.spiritofhack.net.key: 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) [AU]:FR State or Province Name (full name) [Some-State]: Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]:Spirit Of Hack Organizational Unit Name (eg, section) []:Web Services Common Name (eg, YOUR name) []:www.spiritofhack.net Email Address []:contact@spiritofhack.net ----- Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
Attention : ce certificat sera utilisé pour le serveur www.spiritofhack.net. Il est donc primordial de spécifier la bonne URL pour l'option "Common Name". Sans cela, les navigateurs clients léveront une erreur comme quoi le certificat utilisé correspond à un serveur différent de celui qui est visité, et qu'il s'agit certainement d'une tentative d'usurpation d'identité.
La dernière étape est la signature de notre certificat par notre CA :
SoH:~/CA# openssl x509 -req -in www.spiritofhack.net.csr -out www.spiritofhack.net.crt -sha1 -CA spiritofhackCA.crt -CAkey spiritofhackCA.key -CAcreateserial -days 3650 Signature ok subject=/C=FR/ST=Some-State/O=Spirit Of Hack/OU=Web Services/CN=www.spiritofhack.net/emailAddress=contact@spiritofhack.net Getting CA Private Key Enter pass phrase for spiritofhackCA.key:
Configuration Apache
Nous disposons maintenant d'un certificat valide pour www.spiritofhack.net, et signé par notre autorité de certification maison. Il ne reste donc plus qu'à modifier la configuration d'Apache afin de lui spécifier quel certificat utiliser, et l'endroit où se trouve l'autorité de certification :
SSLEngine on SSLCertificateFile /etc/ssl/certs/www.spiritofhack.net.crt SSLCertificateKeyFile /etc/ssl/private/www.spiritofhack.net.key SSLCACertificateFile /etc/ssl/certs/spiritofhackCA.crt
Et le tour est joué :)
Certificats multidomaines
A cause des mécanismes de base de SSL, il est impossible d'utiliser différents certificats SSL sur une même adresse IP. On pourrait par exemple souhaiter avoir un certificat pour www.spiritofhack.net, un pour wiki.spiritofhack.net et un pour forum.spiritofhack.net. Ca n'est malheureusement pas possible pour l'instant.
L'une des solutions est donc l'utilisation d'un certificat unique, qui sera valable pour l'ensemble des sous-domaines. Voici la démarche à suivre :
Il faut commencer par modifier le fichier de configuration d'openssl (/etc/ssl/openssl.cnf) afin de lui spécifier qu'on gère plusieurs sous-domaines (correspondant aux vhosts apache) :
[ multidomains. ] req_extensions = multidomains ...
[ multidomains ] subjectAltName = DNS:spirtofhack.net, DNS:www.spiritofhack.net, DNS:wiki.spiritofhack.net, DNS:forum.spiritofhack.net
On crée ensuite une paire de clé et une demande de certificats en utilisant cette configuration :
SoH:~/CA# openssl req -newkey rsa:1024 -new -out spiritofhack.net.csr -config /etc/ssl/openssl.cnf Generating a 1024 bit RSA private key .................................................++++++ ..........++++++ writing new private key to 'privkey.pem' Enter PEM pass phrase: Verifying - Enter PEM pass phrase: ----- 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) [AU]:FR State or Province Name (full name) [Some-State]: Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]:Spirit Of Hack Organizational Unit Name (eg, section) []:Web Services Common Name (eg, YOUR name) []:spiritofhack.net Email Address []:contact@spiritofhack.net ----- Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: SoH:~/CA# openssl rsa -in privkey.pem -out spiritofhack.net.key Enter pass phrase for privkey.pem: writing RSA key SoH:~/CA#
Ensuite, nous utilisons notre autorité de certification maison pour signer ce certificat. Pour cela, il faut importer la configuration multi-domaines depuis un fichier externe, contenant les différents sous-domaines utilisés :
SoH:~/CA# cat pouet.txt [ multidomains ] subjectAltName = DNS:spirtofhack.net, DNS:www.spiritofhack.net, DNS:wiki.spiritofhack.net, DNS:forum.spiritofhack.net
Signature du certificat :
SoH:~/CA# openssl x509 -req -in spiritofhack.net.csr -out spiritofhack.net.crt -CA /etc/ssl/certs/spiritofhackCA.crt -CAkey /root/CA /spiritofhackCA.key -extfile pouet.txt -days 3650 -extensions multidomains Signature ok subject=/C=FR/ST=Some-State/O=Spirit Of Hack/OU=Web Services/CN=spiritofhack.net/emailAddress=contact@spiritofhack.net Getting CA Private Key Enter pass phrase for /root/CA/spiritofhackCA.key: SoH:~/CA#
Une fois le certificat signé, il reste à le déplacer dans /etc/ssl/certs/, et mettre la clé dans /etc/ssl/private, puis d'utiliser les directives apache :
SSLEngine on SSLCertificateFile /etc/ssl/certs/spiritofhack.net.crt SSLCertificateKeyFile /etc/ssl/private/spiritofhack.net.key SSLCACertificateFile /etc/ssl/certs/spiritofhackCA.crt
Voilà, SoH dispose d'un certificat valide pour chacun de ses sous domaines :)
A deux petits inconvénients près :
- Le certificat contient la liste de tous les sous-domaines pour lesquels ils s'appliquent, ce qui n'est pas forcément une bonne chose si vous hébergez des sous-domaines plus persos
- Si un nouveau sous-domaine est créé, il faut alors redéfinir un certificat