Lors de la connexion à un nouveau serveur/inconnu (avec OpenSSH récent), par exemple:
ssh example.com
Vous obtenez l'empreinte digitale comme ci-dessous:
The authenticity of Host 'example.org (192.0.2.42)' can't be established.
RSA key fingerprint is SHA256:7KMZvJiITZ+HbOyqjNPV5AeC5As2GSZES5baxy1NIe4.
Are you sure you want to continue connecting (yes/no)?
Cependant, les empreintes digitales sont généralement données pour le serveur sous cette forme:
f6:fc:1c:03:17:5f:67:4f:1f:0b:50:5a:9f:f9:30:e5
Comment puis-je vérifier l'authenticité (sans déranger les administrateurs du serveur pour qu'ils fournissent une empreinte SHA256)?
Auparavant, l'empreinte digitale était donnée sous la forme d'un hachage md5 hexadécimal. Depuis OpenSSH 6.8 , l’empreinte est maintenant affichée en base64 SHA256 (par défaut). Vous ne pouvez pas les comparer directement.
Ils ont également ajouté une nouvelle option de configuration FingerprintHash
. Vous pouvez mettre
FingerprintHash md5
dans votre ~/.ssh/config
pour revenir à l'ancienne valeur par défaut ( moins sécurisé ) ou utilisez simplement cette option pour un usage unique:
ssh -o FingerprintHash=md5 example.org
ce qui donnerait l'empreinte digitale comme
MD5:f6:fc:1c:03:17:5f:67:4f:1f:0b:50:5a:9f:f9:30:e5
Espérons que les administrateurs de serveur fournissent les deux types d'empreintes dans un proche avenir.
MODIFIER:
Comme indiqué dans le Arch Linux forums , il existe également une troisième option:
Host example.org
FingerprintHash md5
EDIT:
Vous pouvez générer le hachage d'une clé arbitraire comme indiqué dans le OpenSSH Cookbook :
Récupérer la clé:
ssh-keyscan example.org > key.pub
/etc/ssh
Générez le hachage:
key.pub
ou exécutez ssh-keyscan -t rsa example.org > key.pub
ssh-keygen -l -f key.pub
(hachage par défaut, selon la version de OpenSSH)ssh-keygen -l -f key.pub -E md5
(md5 sur OpenSSH actuel)awk '{print $2}' ssh_Host_rsa_key.pub | base64 -d | sha256sum -b | awk '{print $1}' | xxd -r -p | base64
(sha256 sur le vieil OpenSSH)awk '{print $3}'
pour les versions plus récentes de ssh-keyscan car le format a changé)Je viens de créer un petit script bash qui imprimera une table avec les empreintes digitales de tous les chiffrements de clé autorisés sur le serveur (selon /etc/ssh/sshd_config
) à la fois en SSH-256
et MD5
algo. Voici un exemple de sortie:
+---------+---------+-----------------------------------------------------+
| Cipher | Algo | Fingerprint |
+---------+---------+-----------------------------------------------------+
| RSA | MD5 | MD5:15:66:80:fd:79:d8:c0:92:e8:39:4a:bc:4e:c4:00:15 |
| RSA | SHA-256 | SHA256:G+rKuLGk+8Z1oxUV3cox0baNsH0qGQWm/saWPr4qZMM |
+---------+---------+-----------------------------------------------------+
| ECDSA | MD5 | MD5:f5:90:5c:03:2e:38:1b:c9:86:bd:86:47:5d:22:79:17 |
| ECDSA | SHA-256 | SHA256:GGmuOzsG4EGeRV9KD1WK7tRf3nIc40k/5jRgbTZDpTo |
+---------+---------+-----------------------------------------------------+
| ED25519 | MD5 | MD5:d1:5a:04:56:37:f4:75:19:22:e6:e5:d7:41:fd:79:fa |
| ED25519 | SHA-256 | SHA256:QVdqYeVzvsP4n5yjuN3D2fu8hDhskOxQCQAV5f9QK7w |
+---------+---------+-----------------------------------------------------+
+---[RSA 2048]----+ +---[RSA 2048]----+ +---[ECDSA 256]---+ +---[ECDSA 256]---+ +--[ED25519 256]--+ +--[ED25519 256]--+
|.oE. +.++ | | .o+= | | ... Eoo | | .. o.o.. .| | ooo++o.+*| | .o++o. +oo |
| . o +oo. | | .o= = | | +.=.=.o . | | . .o *.. ..| | . oo.+o.o=| | ...o.+ |
| + . . o.= | | ... X + | | . X.o.* | |o o ++o .. | | . o. ...+| | ..oo.o . |
| = + .+ o | | .. = + o | | + = o o | |.+ .o.o .o | | + ..o| | =oo .+ |
| o o .S . | | . .S o o | | . = S . | |... oo.S .E* * | | S ..| | .SO . . |
| + | | . E. =o.. | | o | | .. o. . o *.O o| | . | | o B .o.. |
| o | | .o. *.o. *. | | | | ... . o * * | | . | | E *..=.o|
| . | | oo=... +. | | | | +. o + o| | E| | . +.+B+|
| | |o+=.o....o+o | | | | .o+ . | | | | o.ooOX|
+------[MD5]------+ +----[SHA256]-----+ +------[MD5]------+ +----[SHA256]-----+ +------[MD5]------+ +----[SHA256]-----+
Le script sera également exécuté sur les serveurs avec la version SSH
inférieure à 6.8
(avant que l'option -E md5
ait été ajoutée).
Édition: versions mises à jour pour des versions encore plus récentes de SSH qui basculaient maintenant les chiffrements par défaut avec le support des images ASCII.
#!/bin/bash
# server_ssh_fingerprints
#
# Version 0.2
#
# 2016 Kepi <[email protected]
# MIT License
#
# Print fingerprint matrix for all allowed Host Keys
# with all allowed ciphers and MD5 and SHA-256 algos
#
# Changelog:
#
# 2018-03-11 (0.2):
# - Support for newer versions of OpenSSH
# - Added visual keys for all algos too - only in recent OpenSSH versions
# standard sshd config path
SSHD_CONFIG=/etc/ssh/sshd_config
# helper functions
function tablize {
awk '{printf(" | %-7s | %-7s | %-51s |\n", $1, $2, $3)}'
}
LINE=" +---------+---------+-----------------------------------------------------+"
# header
echo "$LINE"
echo "Cipher" "Algo" "Fingerprint" | tablize
echo "$LINE"
declare -A ALGOS
declare -a ASCII
# fingerprints
while read -r Host_key; do
cipher=$(echo "$Host_key" | sed -r 's/^.*ssh_Host_([^_]+)_key\.pub$/\1/'| tr 'a-z' 'A-Z')
if [[ -f "$Host_key" ]]; then
if ssh-keygen -E md5 -l -f "$Host_key" &>/dev/null; then
IFS=$'\n'
for algo in md5 sha256; do
n=0
for line in $(ssh-keygen -E $algo -lv -f "$Host_key"); do
n=$(( n + 1))
if [[ $n -eq 1 ]]; then
ALGOS[$algo]=$(echo "$line" | awk '{print $2}')
else
ASCII[$n]="${ASCII[$n]} ${line}"
fi
done
done
else
ALGOS[md5]=$(ssh-keygen -l -f "$Host_key" | awk '{print $2}')
ALGOS[sha256]=$(awk '{print $2}' "$Host_key" | base64 -d | sha256sum -b | awk '{print $1}' | xxd -r -p | base64)
fi
echo "$cipher" MD5 "${ALGOS[md5]}" | tablize
echo "$cipher" SHA-256 "${ALGOS[sha256]}" | tablize
echo "$LINE"
fi
done < <(awk '/^HostKey/ {sub(/^HostKey\s+/,"");print $0".pub"};' $SSHD_CONFIG)
echo
for line in "${ASCII[@]}"; do
echo "$line"
done
C'est une jolie impression utilisant les informations de la réponse de JonnyJD
. Merci.
il s'avère que ssh-keygen (quelque temps après la version 6.6; vraisemblablement, la 6.8) a une option -E md5
qui lui permettra d’imprimer l’empreinte digitale sous la forme d’une empreinte digitale md5. Donc, si vous pouvez récupérer indépendamment le fichier de clé publique du serveur, vous pouvez le nourrir avec ssh-keygen -E md5 -l -f ssh_Host_rsa_key.pub
et obtenir votre empreinte digitale familière.
Le one-liner suivant fonctionne (au moins) sur Ubuntu 16.04,18.04 / Centos >= 7
(Testé avec les serveurs: openssh 3.9
- openssh 7.4
)
ssh-keygen -l -E md5 -f <(ssh-keyscan -t rsa 192.168.2.1) \
| awk '{print $2}' | cut -d":" -f 2-
Sortie:
# 192.168.2.1:22 SSH-2.0-OpenSSH_5.3
65:2c:c4:03:03:2f:6d:c0:c0:09:79:e7:33:c4:f1:78
essayé de modifier pour obtenir également l'art aléatoire dans la table:
# standard sshd config path
SSHD_CONFIG=/etc/ssh/sshd_config
# helper functions
function tablize {
awk '{printf("| %-7s | %-51s |\n", $1, $3)}'
}
LINE="+---------+-----------------------------------------------------+"
# header
echo $LINE
echo "Cipher" "Fingerprint" "Fingerprint" | tablize
echo $LINE
# fingerprints
for Host_key in $(awk '/^HostKey/ {sub(/^HostKey\s+/,"");print $0".pub"};' $SSHD_CONFIG); do
cipher=$(echo $Host_key | sed -r 's/^.*ssh_Host_([^_]+)_key\.pub$/\1/'| tr '[a-z]' '[A-Z]')
if [[ -f "$Host_key" ]]; then
md5=$(ssh-keygen -l -f $Host_key -E md5 | awk '{print $2}')
sha256=$(ssh-keygen -l -f $Host_key | awk '{print $2}')
art_sha256=$(ssh-keygen -lv -f $Host_key | grep -v -w "256 SHA256" | grep -v -w "1024 SHA256" | grep -v -w "2048 SHA256")
art_md5=$(ssh-keygen -lv -f $Host_key -E md5 | grep -v "256 MD5" | grep -v "1024 MD5" | grep -v "2048 MD5")
echo $cipher MD5 $md5 | tablize
echo $cipher SHA-256 $sha256 | tablize
echo $art_sha256 | tablize
echo $art_md5 | tablize
echo $LINE
fi
done
... mais je ne suis pas un programmeur et le script ne fonctionne pas comme prévu. J'apprécierais si quelqu'un peut aider à réparer (également le nettoyage). Il serait bien d’avoir côte à côte des images d’art aléatoires sha256 et md5 pour utiliser l’espace plus efficacement. J'ai également modifié les commandes md5 et sha256 car les commandes d'origine ne fonctionnaient pas pour moi (système probablement trop nouveau) - seul sha256 a été placé dans une table avec le signe "=" à la fin, qui ne faisait pas partie de l'empreinte réelle et ne pouvait pas l'enlever.
(désolé je n'ai pas pu commenter car je me suis enregistré récemment)