SSL Secure Socket Layer R. Kobylanski romain.kobylanski@inpg.fr FC INPG janvier 2005 - version 1.1
1 Protocole SSL 2
SSL/TLS Encapsule des protocoles non sécurisés (HTTP IMAP...) dans une couche chiffrée Authentifie les correspondants avec des certificats les serveur est toujours authentifié, optionnellement le client Contrôle l intégrité des transferts Totalement transparent dans le protocole encapsulé
SSL/TLS Historique SSLv1 juillet 1994 par Netscape SSLv2 décembre 1994 intégré dans Netscape Navigator SSLv3 novembre 1995 TLS (RFC 2246) à base de SSLv3, pb de compatibilité La notation SSL/TLS désigne le protocole TLS avec possibilité de repli transparent sur SSLv3 en cas de problème
SSL Ports Les versions sécurisées des protocoles utilisent un nouveau numéro de port HTTP 80 HTTPS 443 LDAP 389 LDAPS 636 IMAP 143 IMAPS 993 POP3 110 POP3S 995 SMTP 25 SSMTP 465 TELNET 23 TELNETS 992 NNTP 119 NNTPS 563 IRC 194 IRCS 994 FTP 21 FPS 990 FTP-data 20 FPS-data 989
starttls starttls est une commande utilisée par des protocoles non nativement SSL pour basculer dans un mode SSL Cela évite d utiliser deux ports différents pour des communications chiffrées ou non. La standardisation va dans ce sens, le port 465 (ssmtp) n est plus dans la liste des ports fournie par l iana (voir RFC2487)
Modes de fonctionnement confidentialité des échanges Le serveur posséde un certificat qui n est pas vérifiable par le client (certifcat autosigné ou CA inconnue) La communication peut néanmoins être chiffrée authentification du serveur Seul le serveur posséde un certificat dont la signature est vérifiable par le client La communication est alors chiffrée et le serveur authentifié authentification mutuelle Le serveur et le client posssèdent chacun un certificat La communication est chiffrée et les deux parties peuvent s authentifier mutuellement
SSL Protocole Protocole SSL Une première phase (Handshake) permet aux deux parties de négocier les algorithmes et les longueur de clé de s authentifier d établir une première clé de session, qui sera renouvellée au cours des échanges de définir un identificateur de session associé aux paramètres Cet identificateur (SessionId) peut servir à rétablir une session, alors que la connexion tcp a été rompue.
SSL Handshake Protocole SSL
SSL Session En cas de rupture d un comminication TCP Le client envoie un «Client Hello» en utilisant le SessionId Le serveur cherche dans son cache de sessions cet identificateur et retourne un «Server Hello» avec le même id et restaure les paramètres de la session
Protocole Exemple Protocole SSL openssl romain@houat:~ openssl s_client -connect www.tbs-internet.com:443... Certificate chain s:/c=fr/st=calvados/l=caen/o=donnio Jean-Philippe/ OU=TBS-internet/CN=www.TBS-internet.com i:/c=za/st=western Cape/L=Cape Town/O=Thawte Consulting cc/ OU=Certification Services Division/CN=Thawte Server CA/ Email=server-certs@thawte.com --- Server certificate -----BEGIN CERTIFICATE----- MIIC5zCCAlCgAwIBAgIDCCdYMA0GCSqGSIb3DQEBBAUAMIHEMQswCQYDVQQGEwJa... xuflwejub4x+kx9kcmslapq+nlu27uinxcia -----END CERTIFICATE----- --- No client certificate CA names sent ---
Protocole Exemple Protocole SSL openssl --- SSL handshake has read 1303 bytes and written 314 bytes --- New, TLSv1/SSLv3, Cipher is EDH-RSA-DES-CBC3-SHA Server public key is 1024 bit SSL-Session: Protocol : TLSv1 Cipher : EDH-RSA-DES-CBC3-SHA Session-ID: B2F977E3B28EB0B237C268E361335FD2C47499B44631B462 Session-ID-ctx: Master-Key: E6BF0C644F159D9D93FFBA1081A5B4270DDAD382F822002976D5F Key-Arg : None Start Time: 1042659843 Timeout : 300 (sec) Verify return code: 21 (unable to verify the first certificate) ---
Stunnel Protocole SSL Stunnel permet de créer des tunnels ssl vers des serveurs n utilisant pas naturellement le chiffrement. Stunnel est utilisé aussi bien avec des serveurs lancés via inetd (pop imap...) que des serveurs autonomes (smtp http...)
principe Protocole SSL
stunnel Protocole SSL Utilisation de l IGC pour créer des certificats Utilisation de stunnel4 Authentification 1 pas d authentification 2 authentification du serveur 3 authentification mutuelle
Communication en clair Utilisation de netcat pour simuler une communication non chiffrée Écrire un script qui simule le comportement du serveur serveur while true do nc -l -p 1234 done et activer le script Client nc serveur 1234 client Effectuer des échanges
Création des certicats Protocole SSL Utiliser l IGC pour créer un certificat de type serveur pour le serveur de type utilisateur pour le client Il est possible de supprimer la protection des clés privées par un mot de passe afin de faciliter le démarrage automatique du tunnel. Est-ce souhaitable?
Serveur Récupérer les clés et certificat du serveur depuis l IGC stunnel-serveur.cnf cert = stunnel-serveur.crt key = stunnel-serveur.key pid = /tmp/stunnel-serveur.pid debug = 7 foreground = yes output = stunnel-serveur.log [test] accept = 1234 connect = 2345 stunnel4 /usr/sbin/stunnel4 stunnel-serveur.cnf
Client client = yes stunnel-client.cnf pid = /tmp/stunnel-client.pid debug = 7 foreground = yes output = stunnel-client.log [test] accept = 9876 connect = server:1234 stunnel4 /usr/sbin/stunnel4 stunnel-client.cnf nc localhost 9876 client
diagnostic Protocole SSL Observation des logs (stunnel-client.log stunnel-serveur.log) Analyse du protocole (ssldump) Utilser openssl s_client à la place du client stunnel Traffic Analyse de trame ((t)ethereal) capturer le traffic en clair et le traffic chiffré associé
Client Récupérer la chaîne de certification sur le client stunnel-client.cnf client = yes pid = /tmp/stunnel-client.pid debug = 7 foreground = yes output = stunnel-client.log verify = 2 CApath = ca [test] accept = 9876 connect = server:1234 nc localhost 1234 client
Serveur Récupérer la chaîne de certification sur le serveur stunnel-serveur.cnf cert = stunnel-serveur.crt key = stunnel-serveur.key pid = /tmp/stunnel-serveur.pid debug = 7 foreground = yes output = stunnel-serveur.log verify = 2 CApath = ca [test] accept = 1234 connect = 2345
Client Récupérer les clés et certificats du client depuis l IGC stunnel-client.cnf cert = stunnel-client.crt key = stunnel-client.key client = yes pid = /tmp/stunnel-client.pid debug = 7 foreground = yes output = stunnel-client.log verify = 2 CApath = ca [test] accept = 9876 connect = server:1234