Étant donné les clés au format ~ / .ssh / authorized_keys, pouvez-vous déterminer facilement la force des clés?

17

~ / .ssh / authorized_keys [2] contient la liste des clés publiques.

Malheureusement, chaque clé publique ne spécifie pas la force de la clé (nombre de bits).

Existe-t-il un utilitaire qui peut traiter ce fichier ligne par ligne et afficher la force de la clé?

J'ai vérifié les pages de manuel ssh-keygen, mais il semble que cela ne fonctionnerait qu'avec des clés privées.

De plus, existe-t-il un outil qui produirait le hachage sha1 de la même manière qu'il est affiché dans l' pageantoutil Putty?

Le format que je recherche:

Key Algorithm  Strength  Hash                                             Comment
ssh-rsa        2048      00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff  user1@host1
ssh-rsa        2048      11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff:11  user2@host2
Alexander Pogrebnyak
la source
2
Notez que pour openssh-7.2, vous n'avez plus besoin de faire la magie dans la réponse acceptée et vous pouvez simplement alimenter le ssh-keygenavec le fichier entier. Voir ma réponse ci-dessous .
Jakuje

Réponses:

17

ssh-keygen peut faire le cœur du travail (générer une empreinte digitale à partir d'une clé publique), mais il ne traitera pas automatiquement une liste de plusieurs clés comme on le trouve généralement dans un authorized_keysfichier.

Voici un script qui divise les clés, les alimente à ssh-keygen et produit la table que vous souhaitez:

#!/bin/sh

# usage: authkeys-report <authorized_keys-file>    

set -ue

tmp="$(mktemp -t fingerprint-authkeys.XXXXXXXX)"
trap 'rm -f "$tmp"' 0

while read opts key; do
    case "$opts" in
        [0-9]*|ssh-dss|ssh-rsa)
            # not options, first "word" is part of key
            key="$opts $key"
        ;;
    esac
    echo "$key" >$tmp
    set -- $(ssh-keygen -lf "$tmp")
    bits="$1" fingerprint="$2"

    set -- $key # Note: will mangle whitespace in the comment
    case "$1" in
        [0-9]*) # SSH v1 key
            type=rsa1
            shift 3
        ;;
        ssh-rsa|ssh-dss) # SSH v2 key
            type="$1"
            shift 2
        ;;
        *)
            type=unknown
            set --
        ;;
    esac

    printf '%-14s %-9s %s %s\n' "$type" "$bits" "$fingerprint" "$*"
done <$1
Chris Johnsen
la source
tmp="$(mktemp -t fingerprint-authkeys)"doit être changé pourtmp="$(mktemp -t fingerprint-authkeys.XXX)"
Stefan
1
@Stefan: Toutes les versions de mktemp(1)besoin xs: FreeBSD , Mac OS X . Mais, les ajouter ne nuira pas au comportement de ceux qui n'en ont pas besoin (ils se retrouvent juste avec les X avant le suffixe aléatoire).
Chris Johnsen
oh .. :) cool ... j'ai essayé d'exécuter le script sur ma boîte d' arche ... n'arrêtait pas de dire/home/steve/.scripts/key-strength: line 36: $1: unbound variable
Stefan
Merci, l' -loption est vraiment ce que je cherchais! Il est toujours incroyable que vous ne puissiez rien diriger vers ssh-keygen et MUSTavoir un fichier sur le disque.
Alexander Pogrebnyak
1
Notez que pour openssh-7.2, vous n'avez plus besoin de faire cette magie et vous pouvez simplement alimenter le ssh-keygenavec le fichier entier. Voir ma réponse ci-dessous .
Jakuje
10

ssh-keygendans openssh-7.2 (actuellement dans Fedora et Ubuntu Xenial au moins) prend en charge la lecture de plusieurs clés à partir d'un seul fichier. Donc courir simplement

# ssh-keygen -l -f ~/.ssh/authorized_keys
2048 SHA256:xh0IVbI... jakuje@jakuje (RSA)
2048 SHA256:xh0IVbI... jakuje@jakuje (RSA)

donne la sortie souhaitée.

Jakuje
la source
1
Heureusement qu'ils ont finalement corrigé la carence. +1
Alexander Pogrebnyak
7

Si vous avez zsh, vous pouvez le faire en une ligne:

while read line ; do ssh-keygen -lf =(echo $line); done < .ssh/authorized_keys
GaryO
la source
4

extrapoler à partir de la solution zsh une solution bash

while read line ; do ssh-keygen -l -f <(echo $line); done < .ssh/authorized_keys 

/ dev / fd / 63 n'est pas un fichier de clé publique.
/ dev / fd / 63 n'est pas un fichier de clé publique.

presque ... Cela devrait fonctionner, mais ssh-keygen ne semble pas aimer lire directement à partir du fd généré. Utiliser un fichier temporaire pour la redirection <(, ça marche alors. Pourquoi?

while read line
do
  cat > /tmp/key <(echo $line)
  ssh-keygen -l -f /tmp/key
done < .ssh/authorized_keys 

1024 1f: c7: da: ef: ff: ff: ff: ff: c8: 77: c6: f8: 1f: dd: f3: 1a / tmp / key (RSA)
3072 83: cd: af: b4: ff: ff: ff: ff: 02: 30: e7: 1e: 47: ed: c5: 69 / tmp / key (RSA)

bien sûr, alors vous pouvez plus facilement écrire ceci et être heureux

while read line
do
  echo $line > /tmp/key
  ssh-keygen -l -f /tmp/key
done < .ssh/authorized_keys 
rm /tmp/key
Gunstick
la source
Peut-être que la nouvelle version de ssh-keygen peut gérer la lecture à partir d'un fichier spécial, car votre one-liner fonctionne parfaitement pour moi.
Brian Minton
Certaines versions comme la lecture de stdin, d'autres refusent de le faire. Parcourir un fichier normal fonctionne partout.
Marcin
3

Script pour lister toutes les empreintes digitales du authorized_keysfichier, créé par saravana:

#!/usr/bin/ksh

USER=`whoami`
USER_H=` lsuser -a home $USER |awk -F '=' '{print $2}'`

cat $USER_H/.ssh/authorized_keys| while read line
do
  echo $line > /tmp/finger_print
  echo "************* Key,finger print details below ***************************"

  cat /tmp/finger_print
  echo

  ssh-keygen -l -f /tmp/finger_print|grep -v not|awk '{print $1" " $2 " " $4}'
  if ssh-keygen -l -f /tmp/finger_print|grep "is not a" > /dev/null 2>&1
  then
    echo "The above key is an Invalid Key,Please correct it"
  fi

  echo "========================================================================"

  rm /tmp/finger_print
done
Saravana
la source