Dadas las claves en formato ~ / .ssh / certified_keys, ¿puede determinar fácilmente la intensidad de las claves?

17

~ / .ssh / Authorized_keys [2] contiene la lista de claves públicas.

Desafortunadamente, cada clave pública no especifica la intensidad de la clave (número de bits).

¿Existe alguna utilidad que pueda procesar este archivo línea por línea y generar la fuerza clave?

Revisé las páginas de manual ssh-keygen, pero parece que solo funcionaría con claves privadas.

Además, ¿hay una herramienta que generaría sha1 hash de la misma manera que se muestra en la pageantherramienta Putty?

El formato que estoy buscando:

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
fuente
2
Tenga en cuenta que para openssh-7.2, ya no necesita hacer la magia en la respuesta aceptada y simplemente puede alimentar el ssh-keygenarchivo completo. Vea mi respuesta a continuación .
Jakuje

Respuestas:

17

ssh-keygen puede hacer el núcleo del trabajo (generar una huella digital a partir de una clave pública), pero no procesará automáticamente una lista de múltiples claves como se encuentra generalmente en un authorized_keysarchivo.

Aquí hay un script que divide las claves, las alimenta a ssh-keygen y produce la tabla que desea:

#!/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
fuente
tmp="$(mktemp -t fingerprint-authkeys)"debe cambiarse atmp="$(mktemp -t fingerprint-authkeys.XXX)"
Stefan
1
@Stefan: No todas las versiones de mktemp(1)necesidad las X: FreeBSD , Mac OS X . Pero agregarlos no afectará el comportamiento de aquellos que no los necesitan (simplemente terminan con las X antes del sufijo aleatorio).
Chris Johnsen
oh .. :) genial ... intenté ejecutar el script en mi caja de arco ... seguía diciendo/home/steve/.scripts/key-strength: line 36: $1: unbound variable
Stefan
¡Gracias, la -lopción es realmente lo que estaba buscando! Aún así, es increíble que no pueda canalizar nada a ssh-keygen y MUSTtener un archivo en el disco.
Alexander Pogrebnyak
1
Tenga en cuenta que, para openssh-7.2, ya no necesita hacer esta magia y simplemente puede alimentarla ssh-keygencon todo el archivo. Vea mi respuesta a continuación .
Jakuje
10

ssh-keygenen openssh-7.2 (actualmente en Fedora y Ubuntu Xenial al menos) admite la lectura de múltiples claves de un solo archivo. Por lo tanto corriendo simplemente

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

da como resultado la salida deseada.

Jakuje
fuente
1
Es bueno que finalmente hayan solucionado la deficiencia. +1
Alexander Pogrebnyak
7

Si tiene zsh, puede hacer esto como una línea:

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

extrapolando de la solución zsh una solución bash

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

/ dev / fd / 63 no es un archivo de clave pública.
/ dev / fd / 63 no es un archivo de clave pública.

casi ... Esto debería funcionar, pero parece que a ssh-keygen no le gusta leer directamente desde el fd generado. Usando un archivo temporal para <(redirección, entonces funciona. ¿Por qué?

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)

por supuesto, entonces puedes escribir esto más fácilmente y ser feliz

while read line
do
  echo $line > /tmp/key
  ssh-keygen -l -f /tmp/key
done < .ssh/authorized_keys 
rm /tmp/key
Gunstick
fuente
Tal vez la versión más nueva de ssh-keygen pueda manejar la lectura de un archivo especial, porque su one-liner funciona perfectamente para mí.
Brian Minton el
Algunas versiones les gusta leer de stdin, otras se niegan a hacerlo. Ir a través de un archivo normal funciona en todas partes.
Marcin
3

Script para enumerar todas las huellas digitales del authorized_keysarchivo, creado por 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
fuente