~/.ssh/authorized_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 pode processar esse arquivo linha por linha e gerar a força da chave?
Eu verifiquei as páginas de manual de ssh-keygen
, mas parece que só funcionaria com chaves privadas.
Além disso, há uma ferramenta que geraria o hash sha1 da mesma forma que é exibido na ferramenta pageant
PuTTY?
O formato que procuro:
Key Algorithm Strength Hash Comment
ssh-rsa 2048 00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff [email protected]
ssh-rsa 2048 11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff:11 [email protected]
ssh-keygen pode fazer o núcleo do trabalho (gerar uma impressão digital a partir de uma chave pública), mas não irá processar automaticamente uma lista de várias chaves como geralmente é encontrada em um authorized_keys
Arquivo.
Aqui está um script que divide as chaves, alimenta-as para 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
ssh-keygen
no openssh-7.2 (atualmente no Fedora e no Ubuntu Xenial pelo menos) oferece suporte à leitura de várias chaves de um único arquivo. Portanto, executando simplesmente
# ssh-keygen -l -f ~/.ssh/authorized_keys
2048 SHA256:xh0IVbI... [email protected] (RSA)
2048 SHA256:xh0IVbI... [email protected] (RSA)
resulta na saída desejada.
Se você tiver zsh, você pode fazer isso como uma linha:
while read line ; do ssh-keygen -lf =(echo $line); done < .ssh/authorized_keys
extrapolar 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 quê?
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/chave (RSA)
3072 83: cd: af: b4: ff: ff: ff: ff: 02: 30: e7: 1e: 47: ed: c5: 69/tmp/chave (RSA)
claro, então 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
Script para listar todas as impressões digitais de authorized_keys
arquivo, criado 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