User Tools

Site Tools


coursieps:20060120

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é.

1)
http://www.bxlug.be/articles/223 Comment installer le support SSL sur Apache 2 ?
coursieps/20060120.txt · Last modified: 2013/01/30 17:50 (external edit)