web-dev-qa-db-fra.com

Erreur SSL3 lors de la demande de connexion à l'aide de TLS 1.2

J'ai rencontré plusieurs hôtes qui génèrent des erreurs de prise de contact SSL3 même si je demande explicitement TLS 1.2. Pourquoi est-ce? Est-ce que j'utilise mal le client openssl?

 $ openssl s_client -tls1_2 -connect id-images.vice.com:443‹ .____. : s3_pkt.c: 1472: Numéro d'alerte SSL 40 
 140735150146384: erreur: 1409E0E5: Routines SSL: ssl3_write_bytes: Échec de la prise de contact SSL: s3_pkt.c: 656: 
 --- 
 aucun certificat d'homologue disponible 
 --- 
 Aucun nom d'autorité de certification de certificat client envoyé 
 --- 
 La négociation SSL a lu 7 octets et écrit 0 octet 
 --- 
 Nouveau, (AUCUN), le chiffrement est (AUCUN) 
 Renégociation sécurisée IS NON pris en charge 
 Compression: AUCUNE 
 Expansion: NONE 
 Aucun ALPN négocié 
 SSL-Session: 
 Protocole: TLSv1.2 
 Cipher: 0000 
 ID de session: 
 Session-ID-ctx: 
 Master-Key: 
 Key-Arg: Aucun 
 Identité PSK: Aucun 
 Indice PSK: Aucun 
 Nom d'utilisateur SRP: Aucun 
 Heure de début: 1444078671 
 Délai d'expiration: 7200 (sec) 
 Vérifiez le code retour: 0 (ok) 
 --- 
19
richid

Dans SSL/TLS, le client ne demande pas de version de protocole spécifique; le client annonce la version de protocole maximale qu'il prend en charge, puis le serveur choisit la version de protocole qui sera utilisée. Votre client ne dit pas "utilisons TLS 1.2"; il dit "Je sais jusqu'à TLS 1.2".

Un client peut avoir ses propres exigences supplémentaires, mais il n'y a pas de place pour les indiquer dans le message ClientHello. Si le client ne veut faire que TLS 1.2, alors il doit annoncer "jusqu'à TLS 1.2" dans ses ClientHello, et aussi fermer la connexion si le serveur répond avec un message qui dit autre chose que "faisons TLS 1.2". Dans votre cas, les choses n'ont même pas atteint ce point: le serveur a répondu avec une alerte fatale 40 ("handshake_failure", voir la norme ). Comme le souligne @ dave_thompson_085, cela est dû à un manque de SNI : il s'agit d'une extension par laquelle le client documente dans son message ClientHello le nom du serveur cible. SNI est nécessaire à certains serveurs car ils hébergent plusieurs sites compatibles SSL sur la même adresse IP et ont besoin de ce paramètre pour savoir quel certificat ils doivent utiliser. L'outil de ligne de commande openssl s_client peut envoyer un SNI avec une explicite -servername option.

Comme l'explique @Steffen, SSL 3.0 et toutes les versions TLS sont assez similaires et utilisent le même format d'enregistrement (au moins au début de la prise de contact), donc OpenSSL a tendance à réutiliser les mêmes fonctions. Notez que puisque le serveur ne répond pas du tout par ServerHello, la version du protocole n'est pas encore choisie, et SSL 3.0 est toujours, au moins conceptuellement, une possibilité à ce stade précoce de la prise de contact.

34
Thomas Pornin

ssl3_read_bytes et ssl3_writes_bytes traite les trames de style SSL3. Ce sont les mêmes avec les versions ultérieures, c'est-à-dire TLS1.x. Ainsi, les mêmes fonctions sont utilisées, même si leurs noms peuvent suggérer une chose différente. Il n'y a pas de tls1_read_bytes fonction ou similaire.

9
Steffen Ullrich