Các khóa được cung cấp ở định dạng ~ / .ssh / ủy quyền, bạn có thể xác định cường độ khóa một cách dễ dàng không?


17

~ / .ssh / ủy quyền_key [2] chứa danh sách các khóa công khai.

Thật không may, mỗi khóa công khai không chỉ định cường độ khóa (số bit).

Có tiện ích nào có thể xử lý dòng tệp này theo từng dòng và xuất cường độ khóa không?

Tôi đã kiểm tra trang man ssh-keygen, nhưng có vẻ như nó chỉ hoạt động với khóa riêng.

Ngoài ra, có một công cụ nào sẽ tạo ra băm sha1 giống như cách nó được hiển thị trong pageantcông cụ Putty không?

Định dạng tôi đang tìm kiếm:

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
Lưu ý, đối với openssh-7.2, bạn không cần phải thực hiện phép thuật trong câu trả lời được chấp nhận nữa và bạn chỉ có thể cung cấp ssh-keygentoàn bộ tệp. Xem câu trả lời của tôi dưới đây .
Jakuje

Câu trả lời:


17

ssh-keygen có thể thực hiện cốt lõi của công việc (tạo dấu vân tay từ khóa chung), nhưng nó sẽ không tự động xử lý danh sách nhiều khóa như thường thấy trong một authorized_keystệp.

Đây là một kịch bản phân tách các khóa, đưa chúng vào ssh-keygen và tạo bảng bạn muốn:

#!/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)"phải được đổi thànhtmp="$(mktemp -t fingerprint-authkeys.XXX)"
Stefan

1
@Stefan: Không phải tất cả các phiên bản của mktemp(1)nhu cầu Xs: FreeBSD , Mac OS X . Nhưng, thêm chúng sẽ không làm tổn thương hành vi của những người không cần chúng (họ chỉ kết thúc với X trước hậu tố ngẫu nhiên).
Chris Johnsen

oh .. :) tuyệt ... tôi đã thử chạy tập lệnh trên hộp vòm của mình ... cứ nói/home/steve/.scripts/key-strength: line 36: $1: unbound variable
Stefan

Cảm ơn, -ltùy chọn thực sự là những gì tôi đang tìm kiếm! Tuy nhiên, không thể tin được rằng bạn không thể chuyển bất cứ thứ gì sang ssh-keygen và MUSTcó tệp trên đĩa.
Alexander Pogrebnyak

1
Lưu ý, đối với openssh-7.2, bạn không cần phải thực hiện phép thuật này nữa và bạn chỉ có thể cung cấp ssh-keygentoàn bộ tệp. Xem câu trả lời của tôi dưới đây .
Jakuje

10

ssh-keygentrong openssh-7.2 (Ít nhất là trong Fedora và Ubuntu Xenial) hỗ trợ đọc nhiều khóa từ một tệp. Do đó, chạy đơn giản

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

kết quả trong đầu ra mong muốn.


1
Thật tốt là cuối cùng họ đã sửa chữa sự thiếu hụt. +1
Alexander Pogrebnyak

7

Nếu bạn có zsh, bạn có thể làm điều này như một lớp lót:

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

4

ngoại suy từ giải pháp zsh một giải pháp bash

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

/ dev / fd / 63 không phải là tệp khóa công khai.
/ dev / fd / 63 không phải là tệp khóa công khai.

hầu như ... Điều này sẽ hoạt động, nhưng ssh-keygen dường như không thích đọc trực tiếp từ fd được tạo. Sử dụng tệp tạm thời cho <(chuyển hướng, sau đó nó hoạt động. Tại sao?

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

Tất nhiên sau đó bạn có thể dễ dàng viết điều này và hạnh phúc hơn

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

Có thể phiên bản mới hơn của ssh-keygen có thể xử lý việc đọc từ một tệp đặc biệt, bởi vì một lớp lót của bạn hoạt động hoàn hảo với tôi.
Brian Minton

Một số phiên bản như đọc từ stdin, số khác từ chối. Đi qua một tập tin bình thường làm việc ở khắp mọi nơi.
Marcin

3

Tập lệnh liệt kê tất cả các dấu vân tay từ authorized_keystệp, được tạo bởi 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.