Dadas as chaves no formato ~ / .ssh / allowed_keys, você pode determinar facilmente a força das chaves?

17

~ / .ssh / allowed_keys [2] contém a lista de chaves públicas.

Infelizmente, cada chave pública não especifica a força da chave (número de bits).

Existe um utilitário que possa processar esse arquivo linha por linha e gerar a força da chave?

Eu verifiquei as páginas de manual ssh-keygen, mas parece que funcionaria apenas com chaves privadas.

Além disso, existe uma ferramenta que produziria sha1 hash da mesma maneira que é exibida na pageantferramenta Putty?

O formato que estou procurando:

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
fonte
2
Observe que, para o openssh-7.2, você não precisa mais fazer a mágica na resposta aceita e pode apenas alimentá-lo ssh-keygencom o arquivo inteiro. Veja minha resposta abaixo .
Jakuje 28/08

Respostas:

17

O ssh-keygen pode fazer o núcleo do trabalho (gerando uma impressão digital a partir de uma chave pública), mas não processará automaticamente uma lista de várias chaves, como geralmente é encontrado em um authorized_keysarquivo.

Aqui está um script que divide as chaves, as alimenta com ssh-keygen e produz a tabela que você deseja:

#!/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
fonte
tmp="$(mktemp -t fingerprint-authkeys)"deve ser alterado paratmp="$(mktemp -t fingerprint-authkeys.XXX)"
Stefan
1
@Stefan: Nem todas as versões de mktemp(1)necessidade o Xs: FreeBSD , Mac OS X . Mas adicioná-los não prejudicará o comportamento daqueles que não precisam deles (eles acabam com os Xs antes do sufixo aleatório).
Chris Johnsen
oh .. :) cool ... eu tentei executar o script no meu arco caixa ... ficava dizendo/home/steve/.scripts/key-strength: line 36: $1: unbound variable
Stefan
Obrigado, -lopção é realmente o que eu estava procurando! Ainda assim, é inacreditável que você não possa canalizar nada para o ssh-keygen e MUSTter um arquivo em disco.
Alexander Pogrebnyak
1
Observe que, para o openssh-7.2, você não precisa mais fazer essa mágica e pode apenas alimentá-lo ssh-keygencom o arquivo inteiro. Veja minha resposta abaixo .
Jakuje 28/08
10

ssh-keygenO openssh-7.2 (atualmente pelo menos no Fedora e no Ubuntu Xenial) suporta a leitura de várias chaves de um único arquivo. Portanto, executando simplesmente

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

resulta na saída desejada.

Jakuje
fonte
1
É bom que eles finalmente tenham corrigido a deficiência. 1
Alexander Pogrebnyak
7

Se você possui o zsh, pode fazer isso como uma linha:

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

extrapolar a partir da solução zsh uma solução bash

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

/ dev / fd / 63 não é um arquivo de chave pública.
/ dev / fd / 63 não é um arquivo de chave pública.

quase ... Isso deve funcionar, mas o ssh-keygen parece não gostar de ler diretamente do fd gerado. Usando um arquivo temporário para o <(redirecionamento, ele funciona. Por que?

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: f8: 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)

é claro que você pode escrever isso mais facilmente e ser feliz

while read line
do
  echo $line > /tmp/key
  ssh-keygen -l -f /tmp/key
done < .ssh/authorized_keys 
rm /tmp/key
Gunstick
fonte
Talvez a versão mais recente do ssh-keygen possa lidar com a leitura de um arquivo especial, porque o seu one-liner funciona perfeitamente para mim.
Brian Minton 12/01
Algumas versões, como a leitura de stdin, outras se recusam. Passar por um arquivo normal funciona em qualquer lugar.
Marcin
3

Script para listar todas as impressões digitais do authorized_keysarquivo, criadas por 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
fonte