Kunci yang diberikan dalam format ~ / .ssh / Authorized_key, dapatkah Anda menentukan kekuatan kunci dengan mudah?

17

~ / .ssh / authorized_keys [2] berisi daftar kunci publik.

Sayangnya, setiap kunci publik tidak menentukan kekuatan kunci (jumlah bit).

Apakah ada utilitas yang dapat memproses file ini baris demi baris dan mengeluarkan kekuatan kunci?

Saya memeriksa halaman manual ssh-keygen, tetapi sepertinya itu hanya akan berfungsi dengan kunci pribadi.

Juga, apakah ada alat yang akan menampilkan hash dengan cara yang sama seperti yang ditampilkan di pageantalat Putty?

Format yang saya cari:

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
sumber
2
Perhatikan, bahwa untuk openssh-7.2, Anda tidak perlu melakukan keajaiban dalam jawaban yang diterima lagi dan Anda hanya bisa memberi makan ssh-keygendengan seluruh file. Lihat jawaban saya di bawah ini .
Jakuje

Jawaban:

17

ssh-keygen dapat melakukan inti pekerjaan (menghasilkan sidik jari dari kunci publik), tetapi itu tidak akan secara otomatis memproses daftar beberapa kunci seperti yang biasanya ditemukan dalam authorized_keysfile.

Berikut ini adalah skrip yang membagi kunci, mengumpankannya ke ssh-keygen dan menghasilkan tabel yang Anda inginkan:

#!/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
sumber
tmp="$(mktemp -t fingerprint-authkeys)"harus diubah menjaditmp="$(mktemp -t fingerprint-authkeys.XXX)"
Stefan
1
@Stefan: Tidak semua versi dari mktemp(1)kebutuhan Xs: FreeBSD , Mac OS X . Tetapi, menambahkannya tidak akan melukai perilaku mereka yang tidak membutuhkannya (mereka berakhir dengan X sebelum sufiks acak).
Chris Johnsen
oh .. :) keren ... saya mencoba menjalankan skrip pada kotak lengkung saya ... terus berkata/home/steve/.scripts/key-strength: line 36: $1: unbound variable
Stefan
Terima kasih, -lopsi benar-benar yang saya cari! Masih sulit dipercaya bahwa Anda tidak dapat mem-pipe apa saja ke ssh-keygen dan MUSTmemiliki file di disk.
Alexander Pogrebnyak
1
Catatan, bahwa untuk openssh-7.2, Anda tidak perlu melakukan sihir ini lagi dan Anda hanya bisa makan ssh-keygendengan seluruh file. Lihat jawaban saya di bawah ini .
Jakuje
10

ssh-keygendi openssh-7.2 (Setidaknya saat ini di Fedora dan Ubuntu Xenial) mendukung membaca beberapa kunci dari satu file. Karenanya berjalan sederhana

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

menghasilkan output yang diinginkan.

Jakuje
sumber
1
Bagus bahwa mereka akhirnya memperbaiki kekurangannya. +1
Alexander Pogrebnyak
7

Jika Anda memiliki zsh, Anda dapat melakukan ini sebagai satu-baris:

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

mengekstrapolasi dari solusi zsh solusi bash

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

/ dev / fd / 63 bukan file kunci publik.
/ dev / fd / 63 bukan file kunci publik.

hampir ... Ini seharusnya berhasil, tetapi ssh-keygen sepertinya tidak suka membaca langsung dari fd yang dihasilkan. Menggunakan file temp untuk <(pengalihan, ia kemudian berfungsi. Mengapa?

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 / kunci (RSA)
3072 83: cd: af: b4: ff: ff: ff: ff: 02: 30: e7: 1e: 47: ed: c5: 69 / tmp / key (RSA)

tentu saja Anda bisa lebih mudah menulis ini dan bahagia

while read line
do
  echo $line > /tmp/key
  ssh-keygen -l -f /tmp/key
done < .ssh/authorized_keys 
rm /tmp/key
Pistol
sumber
Mungkin versi terbaru dari ssh-keygen dapat menangani pembacaan dari file khusus, karena one-liner Anda berfungsi dengan baik untuk saya.
Brian Minton
Beberapa versi suka membaca dari stdin, yang lain menolak. Melewati file normal berfungsi di mana-mana.
Marcin
3

Script untuk mendaftar semua sidik jari dari authorized_keysfile, dibuat oleh 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
sumber