Können Sie bei Schlüsseln im Format ~ / .ssh / authorized_keys die Schlüsselstärke leicht bestimmen?


17

~ / .ssh / authorized_keys [2] enthält die Liste der öffentlichen Schlüssel.

Leider gibt jeder öffentliche Schlüssel nicht die Schlüsselstärke (Anzahl der Bits) an.

Gibt es ein Dienstprogramm, das diese Datei zeilenweise verarbeiten und die Schlüsselstärke ausgeben kann?

Ich habe nach Manpages gesucht ssh-keygen, aber es sieht so aus, als würde es nur mit privaten Schlüsseln funktionieren.

Gibt es auch ein Tool, das sha1-Hash so ausgibt, wie es im pageantPutty-Tool angezeigt wird ?

Das Format, das ich suche:

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
Beachten Sie, dass Sie für openssh-7.2 in der akzeptierten Antwort nicht mehr zaubern müssen und ssh-keygendie Datei einfach mit der gesamten Datei füttern können . Siehe meine Antwort unten .
Jakuje

Antworten:


17

ssh-keygen kann den Kern der Arbeit erledigen (Erzeugen eines Fingerabdrucks aus einem öffentlichen Schlüssel), verarbeitet jedoch nicht automatisch eine Liste mit mehreren Schlüsseln, wie dies normalerweise in einer authorized_keysDatei der Fall ist.

Hier ist ein Skript, das die Schlüssel aufteilt, sie an ssh-keygen weiterleitet und die gewünschte Tabelle erstellt:

#!/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)"muss geändert werden intmp="$(mktemp -t fingerprint-authkeys.XXX)"
Stefan

1
@Stefan: Nicht alle Versionen von mktemp(1)Notwendigkeit der Xs: FreeBSD , Mac OS X . Wenn Sie sie jedoch hinzufügen, wird dies nicht das Verhalten derjenigen beeinträchtigen, die sie nicht benötigen (sie landen nur mit einem X vor dem zufälligen Suffix).
Chris Johnsen

oh .. :) cool ... ich habe versucht, das Skript auf meiner Bogenschachtel auszuführen ... sagte immer wieder/home/steve/.scripts/key-strength: line 36: $1: unbound variable
Stefan

Danke, -lOption ist wirklich das, wonach ich gesucht habe! Trotzdem ist es unglaublich, dass Sie nichts an ssh-keygen weiterleiten und MUSTDateien auf der Festplatte haben können.
Alexander Pogrebnyak

1
Beachten Sie, dass Sie für openssh-7.2 diese Magie nicht mehr ausführen müssen und einfach ssh-keygendie gesamte Datei einspeisen können . Siehe meine Antwort unten .
Jakuje

10

ssh-keygenin openssh-7.2 (derzeit mindestens in Fedora und Ubuntu Xenial) unterstützt das Lesen mehrerer Schlüssel aus einer einzelnen Datei. Deshalb einfach laufen

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

ergibt die gewünschte Ausgabe.


1
Gut, dass sie den Mangel endlich behoben haben. +1
Alexander Pogrebnyak

7

Wenn Sie zsh haben, können Sie dies als Einzeiler tun:

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

4

Extrapolieren einer bash-Lösung aus der zsh-Lösung

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

/ dev / fd / 63 ist keine öffentliche Schlüsseldatei.
/ dev / fd / 63 ist keine öffentliche Schlüsseldatei.

fast ... Das sollte funktionieren, aber ssh-keygen scheint es nicht zu mögen, direkt von der generierten fd zu lesen. Wenn Sie eine temporäre Datei für die <(-Umleitung verwenden, funktioniert dies dann. Warum?

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)

dann kannst du das natürlich leichter schreiben und glücklich sein

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

Vielleicht kann die neuere Version von ssh-keygen das Lesen aus einer speziellen Datei verarbeiten, da Ihr Einzeiler für mich perfekt funktioniert.
Brian Minton

Einige Versionen lesen gerne von stdin, andere lehnen dies ab. Das Durchsuchen einer normalen Datei funktioniert überall.
Marcin

3

Skript zum authorized_keysAuflisten aller Fingerabdrücke aus der von saravana erstellten Datei:

#!/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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.