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

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

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ść.


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

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.