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