给定〜/ .ssh / authorized_keys格式的密钥,您可以轻松确定密钥强度吗?


17

〜/ .ssh / authorized_keys [2]包含公钥列表。

不幸的是,每个公共密钥都没有指定密钥强度(位数)。

是否有实用程序可以逐行处理此文件并输出键强度?

我检查了手册页中的ssh-keygen,但看起来只能使用私钥。

另外,是否有一种工具可以像在pageant腻子工具中一样显示sha1哈希值?

我正在寻找的格式:

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将整个文件一起提供即可。请参阅下面的答案
雅库耶

Answers:


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)"
Stefan

1
@Stefan:并非所有的版本mktemp(1)需要X们:FreeBSD的Mac OS X的。但是,添加它们不会损害那些不需要它们的行为(它们只是以随机后缀之前的X结束)。
克里斯·约翰森

哦.. :)太酷了...我试图在我的拱形盒子上运行脚本...一直说/home/steve/.scripts/key-strength: line 36: $1: unbound variable
Stefan 2010年

谢谢,-l选择确实是我想要的!仍然令人难以置信的是,您无法通过管道将任何内容传递给ssh-keygen并MUST在磁盘上存储文件。
Alexander Pogrebnyak

1
请注意,对于openssh-7.2,您不再需要执行此操作,而只需ssh-keygen将整个文件一起提供即可。请参阅下面的答案
雅库耶

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
Alexander Pogrebnyak

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:c:8: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_keyssaravana创建的文件中所有指纹的脚本:

#!/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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.