SSL HTTPS
SSL HTTPS
SSL HTTPS
Fabrice Harrouet
École Nationale d’Ingénieurs de Brest
harrouet@enib.fr
http://www.enib.fr/~harrouet/
Propos
. Limiter le risque lié à la communication
Confidentialité : données lisibles par quiconque ?
◦ Utiliser des algorithmes de chiffrement
Intégrité : données modifiées pendant le transport ?
◦ Utiliser des algorithmes de hachage (condensé)
Authentification : dialogue avec l’entité attendue ?
◦ Obtenir un document officiel identifiant l’interlocuteur
. Préserver les protocoles applicatifs
Ne pas nécessiter une réécriture complète des applications
Une couche supplémentaire dans la pile de protocoles
(usage très similaire à celui de la couche de transport)
. Principes de fonctionnement discutés dans le module ASR
Seule la mise en œuvre est vue ici
& enib, F.H . . . 2/23 %
' Module RX : SSL $
Origine et implémentation
. L’utilitaire openssl
$ openssl command options
De très nombreuses commandes liées à la cryptographie
Client/serveur génériques pour interagir “à la main”
. Quelques exemples pour une mise en œuvre minimale
Client SSL générique (' client nc avec chiffrement)
$ openssl s_client -host hostname -port port
Serveur SSL générique (' serveur nc avec chiffrement)
$ openssl s_server -accept port -cert cert.pem -key key.pem
Générer un certificat auto-signé (-x509) sans pass-phrase (-nodes)
$ openssl req -x509 -nodes -newkey rsa:1024 \
-keyout key.pem -out cert.pem
HTTP/1.0 200 OK
<html><body>Hello</body></html>
DONE
shutdown accept socket
shutting down SSL
CONNECTION CLOSED
close(sock);
SSL_CTX_free(ctx); /* detruire le contexte SSL en fin de programme */
int maxFd=-1;
fd_set rdSet;
struct timeval tv0={0,0}; /* preparation d’un eventuel timeout de duree nulle */
struct timeval * ptv=(struct timeval *)0; /* pas de timeout initial */
if(SSL_pending(ssl)) ptv=&tv0; /* si donnees deja pretes, pas d’attente */
else FD_SET_MAX(fd,&rdSet,maxFd); /* sinon scrutation de fd necessaire */
RESTART_SYSCALL(r,select(maxFd+1,&rdSet,(fd_set *)0,(fd_set *)0,ptv));
if(r==-1) { perror("select"); return -1; }
if(SSL_pending(ssl)||FD_ISSET(fd,&rdSet)) { /* pret pour SSL_read() sur ssl */ }
& enib, F.H . . . 15/23 %
' SSL : mise en œuvre $
Bilan intermédiaire
. La connexion en elle-même est relativement sécurisée
Tout le chiffrement dépend du certificat et de la clef-privée du serveur
Seuls le client et le serveur peuvent déchiffrer la communication
Des segments TCP capturés renferment des données incompréhensibles
Leur rejeu est inefficace (utilisation de numéros de séquence)
. Est-on certain de s’adresser au bon serveur ?
Pour l’instant on fait entièrement confiance au serveur !!!
Le certificat du serveur doit être vérifié par le client
◦ Signé par une autorité de certification connue
ou auto-signé mais connu
◦ Conforme au nom du serveur
. Discuté dans le module ASR
r=SSL_get_verify_result(ssl);
if(r!=X509_V_OK) { fprintf(stderr,"!!! Warning !!! Certificate not trusted\n"); }
cert=SSL_get_peer_certificate(ssl);
if(!cert)
{ fprintf(stderr,"SSL_get_peer_certificate: %s\n",
ERR_error_string(ERR_get_error(),NULL)); }
else
{
char commonName[0x100]="";
X509_NAME_get_text_by_NID(X509_get_subject_name(cert),NID_commonName,
commonName,0x100);
if(strcmp(commonName,hostName))
{ fprintf(stderr,"!!! Warning !!! Common name ‘%s’ != host name ‘%s’\n",
commonName,hostName); }
X509_free(cert);
}
Bilan
. La connexion en elle-même est relativement sécurisée
L’écoute du traffic est inutile
. On peut être certain de s’adresser au bon serveur
En n’acceptant que les certificats en bonne et due forme
En ayant une liste d’autorités de certification à jour
En ayant une liste de certificats auto-signés bien tenue
. !!! Repose sur la vigilance de l’application et de l’utilisateur !!!
Prise de risque à la première apparition d’un certificat auto-signé
Une seule fois peut suffire pour divulger son mot de passe ssh !
L’utilisateur doit prendre en compte les avertissements de l’application
. Sujet et API très vastes
Le serveur peut également demander un certificat au client
Énormément de choses non traitées ici . . .
& enib, F.H . . . 23/23 %