SSL: secure socket layer = couche de connexion sécurisée
Rôles:
- authentification
- confidentialité (chiffrement)
- dans une moindre mesure: traçabilité (= engl. non repudiation): la transaction a bien été effectuée (certificats)
Machine A va communiquer avec machine B et A sera certain que c'est B qui envoie et pas une autre machine.
Une fois la connexion établie, tout ce qui passera sur le réseau sera encrypté.
Au niveau des couches (modèle OSI) openssl se trouve entre la couche TCP/IP et les services (http, ftp, imap). Il est donc relativement indépendant des protocoles au dessus. L'utilisation de
- http + ssl = https
- imap + ssl = imaps
- ftp + ssl = ftps
ssl est un protocole dédié au chiffrement de connexion entre machines. ssl n'est pas un protocole standard, il a été développé par Netscape. Il a été repris pas l'IETF (modifié): TLS. Il existe comme versions:
- ssl2
- ssl3
- tls1
~OpenSSL permet d'utiliser les 3. Dans la mesure du possible, nous utiliserons TLS, puisque c'est un standard.
Notion de certificat
= carte d'identité d'un acteur (machine, utilisateur)
Un certificat est délivré par un CA (certified authority = autorité de certification). Ex commercial: Verisign Ex non commercial: ma machine Debian
le CA délivre un certificat sur base d'information fournie par celui qui en fait la demande.
Le client se connecte sur un serveur web en https. Si le serveur appartient à une entreprise dont les serveurs ont un certificat venant d'une CA, lors de l'établissement de la connexion, il envoie au client son certificat signé l'autorité prouvant qui il est.
Autre scénario: le serveur web est sa propre autorité de certification et il auto-signe ses certificats.
Les certificats ci-dessus sont des certificats X509.
La CA est une PKI public key infrastructure = infrastructure à gestion de clefs (IGC). Elle permet de vérifier que les clefs présentées sont bien celles de ceux qui les présentent.
Etablissement d'une connexion SSL
Que se passe-t-il lorsqu'un client se connecte?
Rappel: clef publique: utilisée pour crypter les données (clef privée utilisée pour décrypter). L'ensemble = biclef
- lors de la connexion, le client fait une requête au serveur
- le serveur va initialiser l'authentification par clef publique (RSA ou DSA) en envoyant sa clef publique au client
- le client envoie une clef privée pour l'encryption symétrique (protocole DES, 3DES, RC4, …) après négociation sur le choix du protocole
- les 2 machines ont la clef symétrique et peuvent encrypter, échanger et décrypter les données
Les protocoles utilisés dans l'encryption symétrique utilisent moins de ressources (= plus rapides) que les protocoles utilisés dans l'encryption asymétrique.
Pratique
Apache
Apache peut être sa propre autorité de certification, il peut générer ses propres certificats lui-même. Nous utiliserons /Apache2.
Documentation: 1), /BxLUG
Nous allons d'abord générer le certificat:
apache2-ssl-certificate
Répondre:
Country Name (2 letter code) [GB]:BE State or Province Name (full name) [Some-State]:Brussels Locality Name (eg, city) []:Brussels Organization Name (eg, company; recommended) []:Zongo Nation Organizational Unit Name (eg, section) []: server name (eg. ssl.domain.tld; required!!!) []:www.toto3.lab Email Address []:
Ensuite, le certificat généré est /etc/apache2/ssl/apache.pem
Pour afficher le contenu du certificat:
openssl x509 -in /etc/apache2/ssl/apache.pem -text
La ligne commençant par Issuer: renseigne la CA. Ici, c'est la même personne que le Subject: car le certificat est auto-validé.
Il faut maintenant activer le module:
a2enmod ssl
Ensuite, il faut dire à Apache d'écouter sur le port 443:
echo "Listen 443" >> /etc/apache2/ports.conf
Créer un hôte virtuel /etc/apache2/sites-available/www.toto3.lab.conf
NameVirtualHost *:443 <VirtualHost *:443> ServerName www.toto3.lab DocumentRoot /var/www/toto3.lab SSLEngine on SSLCertificateFile /etc/apache2/ssl/apache.pem </VirtualHost>
~NameVirtualHost: basé sur le nom et pas sur l'IP. Connexion via le port 443 (https)
Et recharger apache:
/etc/init.d/apache2 force-reload
J'ai un problème: quand j'essaie dans Firefox d'aller sur http://www.toto3.lab/ j'ai l'erreur suivante:
The connection to www.toto3.lab has terminated unexpectedly. Some data may have been transferred.
Dans links-ssl, ça donne “SSL Error”.
Je ne vois rien dans les logs.
Si je fais:
openssl s_client -connect localhost:443 -state -debug
J'ai une erreur:
... SSL_connect:error in SSLv2/v3 read server hello A 2478:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt.c:478:
C'était un problème de certificat. Je l'ai régénéré et c'est bon.
Générer son propre certificat
avec openssl (plus apache) Générer la clef:
cd /etc/apache2/ssl/ openssl genrsa -out truc.be.key
Il y a maintenant un fichier texte truc.be.key contenant:
-----BEGIN RSA PRIVATE KEY----- MIIBOgIBAAJBAL/XpucwdlGdH1oDSC7xT/ps420lom4EETB1gVRcWeD3sbA1wuX5 H1iMbaJwgCgCrQxbyHewnB3TddVAp8evZjcCAxEAAQJBALhCxrF5r7tWAf3v9w33 g40RtyNnqWqoB2aXBmBjz4QuWOTeIIA7CczBhtBfEEd9RdDZtkjT+nYCEJbR6EPT RNkCIQDzj1yrGrnk3t/2feCOdgCO7Jg1J4IBoaQwpej9MUAYdQIhAMmkEBWRYG46 Q97Fsq1O1ZeEUgCUsj6EFq3kZCrusE57AiBlb0lqwUC2PtQLdjU1X5Ov8n0ZdhDA 2S7mS9KS0BYfmQIgHO5ALIgGOOp9MGpXH4yPEsU2asTq6hNTmbGKOaqzex8CICcJ lDLO9FopHuXHvFXOjtqE/kiniP3qf/YSZp/zoutn -----END RSA PRIVATE KEY-----
Ensuite il faut générer un certificat x509 auto-signé:
openssl req -new -key truc.be.key -x509 -out truc.be.crt
Et il va générer un certificat truc.be.crt dans le répertoire courant (après qu'on ait répondu aux questions).
On peut remplacer dans le virtualhost la ligne
SSLCertificateFile /etc/apache2/ssl/apache.pem
par
SSLCertificateFile /etc/apache2/ssl/truc.be.crt SSLCertificateKeyFile /etc/apache2/ssl/truc.be.key
Devenir une autorité de certification
/usr/lib/ssl/misc/CA.pl -newca
(taper enter à la première question) Ceci permet à la machine de signer des certificats générés par un tiers. Il va créer des fichiers dans un répertoire créé pour l'occasion: ./demoCA dans lequel on trouve:
- cacert.pem: clef publique
- private/cakey.pem: clef privée
Ensuite, l'autorité de certification attend qu'on lui envoie une requête de certification (.csr certificate signature request).
Générer une demande
- générer une autre clef:
openssl genrsa -out truc2.key
- générer une demande de certificat - Attention: remplir tous les champs
openssl req -new -key truc2.key -out truc2.csr
Ensuite, il faut que la CA signe la demande (se mettre dans le répertoire contenant demoCA):
openssl ca -policy policy_anything -out truc2.crt -infiles truc2.csr
La semaine prochaine: ftp et mail sécurisé.