Biorąc pod uwagę klucze w formacie ~ / .ssh / Author_keys, czy możesz łatwo określić siłę klucza?

17

~ / .ssh / Author_keys [2] zawiera listę kluczy publicznych.

Niestety, każdy klucz publiczny nie określa siły klucza (liczby bitów).

Czy istnieje narzędzie, które może przetwarzać ten plik linia po linii i generować siłę klucza?

Sprawdziłem strony podręcznika pod kątem ssh-keygen, ale wygląda na to, że będzie działać tylko z kluczami prywatnymi.

Ponadto, czy istnieje narzędzie, które wyświetlałoby skrót Sha1 w taki sam sposób, jak jest wyświetlane w pageantnarzędziu Putty?

Format, którego szukam:

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
źródło
2
Zauważ, że w openssh-7.2 nie musisz już robić magii w zaakceptowanej odpowiedzi i możesz po prostu nakarmić ssh-keygencały plik. Zobacz moją odpowiedź poniżej .
Jakuje

Odpowiedzi:

17

ssh-keygen może wykonać rdzeń pracy (generowanie odcisku palca z klucza publicznego), ale nie przetwarza automatycznie listy wielu kluczy, jak to zwykle znajduje się w authorized_keyspliku.

Oto skrypt, który dzieli klucze, przekazuje je do ssh-keygen i tworzy żądaną tabelę:

#!/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
źródło
tmp="$(mktemp -t fingerprint-authkeys)"należy zmienić natmp="$(mktemp -t fingerprint-authkeys.XXX)"
Stefan
1
@Stefan: Nie wszystkie wersje mktemp(1)potrzebują xs: FreeBSD , Mac OS X . Ale dodanie ich nie zaszkodzi zachowaniu tych, którzy ich nie potrzebują (po prostu kończą się na X przed losowym przyrostkiem).
Chris Johnsen
oh .. :) fajne ... Próbowałem uruchomienie skryptu na mojej arch oknie ... powtarzał/home/steve/.scripts/key-strength: line 36: $1: unbound variable
Stefan
Dzięki, -lopcja była naprawdę tym, czego szukałem! Nadal jest niewiarygodne, że nie można MUSTprzesyłać niczego do ssh-keygen i mieć pliku na dysku.
Alexander Pogrebnyak
1
Zauważ, że w openssh-7.2 nie musisz już wykonywać tej magii i możesz po prostu nakarmić ssh-keygencały plik. Zobacz moją odpowiedź poniżej .
Jakuje
10

ssh-keygenw openssh-7.2 (obecnie przynajmniej w Fedorze i Ubuntu Xenial) obsługuje odczyt wielu kluczy z jednego pliku. Dlatego działa po prostu

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

daje pożądaną wydajność.

Jakuje
źródło
1
Dobrze, że w końcu naprawili niedobór. +1
Alexander Pogrebnyak
7

Jeśli masz Zsh, możesz to zrobić jako jeden wiersz:

while read line ; do ssh-keygen -lf =(echo $line); done < .ssh/authorized_keys
GaryO
źródło
4

ekstrapolowanie z rozwiązania zsh rozwiązania bash

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

/ dev / fd / 63 nie jest plikiem klucza publicznego.
/ dev / fd / 63 nie jest plikiem klucza publicznego.

prawie ... Powinno to działać, ale wydaje się, że ssh-keygen nie lubi czytać bezpośrednio z wygenerowanego fd. Używanie pliku tymczasowego dla <(przekierowanie, to działa. Dlaczego?

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)

oczywiście możesz łatwiej to napisać i być szczęśliwym

while read line
do
  echo $line > /tmp/key
  ssh-keygen -l -f /tmp/key
done < .ssh/authorized_keys 
rm /tmp/key
Pistolet
źródło
Być może nowsza wersja ssh-keygen poradzi sobie z odczytem ze specjalnego pliku, ponieważ twoja jedna linijka działa dla mnie idealnie.
Brian Minton
Niektóre wersje, takie jak czytanie ze standardowego wejścia, inne odmawiają. Przejście przez normalny plik działa wszędzie.
Marcin
3

Skrypt zawierający listę wszystkich odcisków palców z authorized_keyspliku utworzonego przez 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
źródło