Давши клавіші у форматі ~ / .ssh / санкціоновані_кільки, чи можна легко визначити силу клавіш?


17

~ / .ssh / Author_keys [2] містить список відкритих ключів.

На жаль, у кожному відкритому ключі не визначається сила ключа (кількість біт).

Чи є утиліта, яка може обробляти цей файл за рядком та виводити ключову потужність?

Я перевіряв сторінки чоловіків ssh-keygen, але, схоже, він працюватиме лише з приватними ключами.

Також, чи є інструмент, який виводить хеш sha1 так само, як він відображається в pageantінструменті Putty?

Я шукаю формат:

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
Зауважте, що для openssh-7.2 вам більше не потрібно робити магію у прийнятій відповіді, і ви можете просто подати ssh-keygenцілий файл. Дивіться мій відповідь нижче .
Jakuje

Відповіді:


17

ssh-keygen може виконати основну частину роботи (генеруючи відбиток пальця з відкритого ключа), але він автоматично не обробляє список декількох ключів, як це зазвичай знаходиться у authorized_keysфайлі.

Ось сценарій, який розбиває ключі, подає їх на ssh-keygen і виробляє потрібну таблицю:

#!/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)"треба змінити наtmp="$(mktemp -t fingerprint-authkeys.XXX)"
Стефан

1
@Stefan: Не всі версії mktemp(1)мають потребу в Xs: FreeBSD , Mac OS X . Але додавання їх не зашкодить поведінці тих, хто їм не потрібен (вони просто закінчуються символами X перед випадковим суфіксом).
Кріс Джонсен

ой ... :) круто ... Я спробував запустити сценарій на моїй арковій коробці ... продовжував говорити/home/steve/.scripts/key-strength: line 36: $1: unbound variable
Стефан

Дякую, -lваріант - це дійсно те, що я шукав! Але все-таки неймовірно, що ви не можете нічого передати в ssh-keygen та MUSTмати файл на диску.
Олександр Погребняк

1
Зауважте, що для openssh-7.2 вам більше не потрібно робити цю магію, і ви можете просто годувати ssh-keygenцілий файл. Дивіться мій відповідь нижче .
Jakuje

10

ssh-keygenу openssh-7.2 (на даний момент у Fedora та Ubuntu Xenial як мінімум) підтримує зчитування декількох клавіш з одного файлу. Тому працює просто

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

приводить до бажаного виходу.


1
Добре, що вони остаточно усунули дефіцит. +1
Олександр Погребняк

7

Якщо у вас є zsh, ви можете це зробити як однолінійний:

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

4

екстраполяція з розчину zsh розчин bash

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

/ dev / fd / 63 не є відкритим файлом.
/ dev / fd / 63 не є відкритим файлом.

майже ... Це повинно працювати, але, схоже, ssh-keygen не любить читати безпосередньо із створеного fd. Використовуючи тимчасовий файл для <(перенаправлення, він працює тоді. Чому?

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)

звичайно, тоді ви можете простіше написати це і бути щасливим

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

Можливо, новіша версія ssh-keygen може впоратися з читанням із спеціального файлу, тому що ваш однолінійний вміст для мене прекрасно працює.
Брайан Мінтон

Деякі версії, як читання з stdin, інші відмовляються. Перехід через звичайний файл працює скрізь.
Marcin

3

Сценарій, щоб перелічити всі відбитки пальців із authorized_keysфайлу, створеного 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.