Vérification d'empreinte lors d'une connexion SSH (suite)

Comme je l'ai déjà présenté ici même, OpenSSH couplé à des enregistrements SSHFP dans le DNS permettent de faciliter l'authentification d'un serveur lors de la connexion initiale (on parle de modèle TOFU : Trust On First Use).

Or depuis la publication d'OpenSSH 5.7, un serveur peut maintenant se faire reconnaître via une signature ECDSA en plus des habituelles DSA et RSA. ECDSA est un algorithme cryptographique basé sur les courbes elliptiques (Elliptic Curve Digital Signature Algorithm), ce qui apporte une variété bienvenue dans les solutions mathématiques utilisées.

Et dans le cas qui nous concerne, un problème se pose : il n'est actuellement pas possible de générer un enregistrement DNS correspondant pour SSHFP.

La création des enregistrements RSA (type 1 dans l'exemple ci-dessous) et DSA (type 2) fonctionne fort bien, conformément à ce que prévoit le RFC 4255 :

$ ssh-keygen -r serveur.example.net
serveur.example.net IN SSHFP 1 1 4fc1c467a52ee19afec96fbed3b886aba6054cba
serveur.example.net IN SSHFP 2 1 5048f6f74fb7b1e04b0da2de08321ee4168ef77a

Mais si l'on demande la création pour ECDSA, on est coincé :

$ ssh-keygen -f /etc/ssh/ssh_host_ecdsa_key.pub -r serveur.example.net
export_dns_rr: unsupported algorithm

Et pour cause, le RFC 4255 ne prévoit rien dans ce cas. Un RFC est en préparation pour pallier à cela, mais le chemin de validation n'est pas encore fini ("Adding new reservations requires IETF consensus").

Que faire donc ? Si lors d'une connexion le client SSH (version 5.7) recherche une clé, il regardera pour ECDSA par défaut :

$ ssh -o "VerifyHostKeyDNS ask" serveur.example.net
Error calculating host key fingerprint.
The authenticity of host 'serveur.example.net (192.168.1.2)' can't be established.
ECDSA key fingerprint is df:81:f3:5c:24:ec:dc:eb:4a:89:99:3d:47:a5:54:8b.
No matching host key fingerprint found in DNS.
Are you sure you want to continue connecting (yes/no)?

Il suffit alors de préciser que l'on vérifiera une clé RSA, comme à l'habitude, en attendant une norme définitive :

$ ssh -o "VerifyHostKeyDNS ask" -o "HostKeyAlgorithms=ssh-rsa" serveur.example.net
The authenticity of host 'serveur.example.net (192.168.1.2)' can't be established.
RSA key fingerprint is ee:15:6e:29:95:2c:f2:73:b8:e5:a6:13:95:8d:e4:9f.
Matching host key fingerprint found in DNS.
Are you sure you want to continue connecting (yes/no)?

Pour rendre les choses plus simples, les options pourront être placée dans le fichier ~/.ssh/config pour l'hôte auquel on se connecte.

publié le 6 décembre 2011