Obter impressão digital da chave do servidor SSH

69

Existe uma maneira de programaticamente obter uma impressão digital da chave do servidor SSH sem autenticar para ela?

Estou tentando ssh -v user@host false 2>&1 | grep "Server host key" , mas isso trava à espera de uma senha se a autenticação baseada em chave não estiver configurada.

    
por goncalopp 28.04.2014 / 15:23

5 respostas

58

Você pode fazer isso combinando ssh-keyscan e ssh-keygen :

$ file=$(mktemp)
$ ssh-keyscan host > $file 2> /dev/null
$ ssh-keygen -l -f $file
521 de:ad:be:ef:de:ad:be:ef:de:ad:be:ef:de:ad:be:ef host (ECDSA)
4096 8b:ad:f0:0d:8b:ad:f0:0d:8b:ad:f0:0d:8b:ad:f0:0d host (RSA)
$ rm $file

(infelizmente o muito mais simples ssh-keyscan host | ssh-keygen -l -f /dev/stdin não funciona)

    
por 28.04.2014 / 15:45
45

Eu recentemente tive que fazer isso sozinho, então pensei em adicionar uma resposta que mostre como isso pode ser feito (com versões do OpenSSH 7.2 ou mais recente ) em uma linha usando a substituição do processo:

ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)

O texto a seguir explica como esses comandos funcionam e destaca alguns dos diferenças de comportamento entre as versões mais antigas e mais recentes do OpenSSH utilitários.

Buscar chaves de host públicas

O comando ssh-keyscan foi desenvolvido para que os usuários possam obter o host público chaves sem precisar autenticar no servidor SSH. De sua página de manual:

ssh-keyscan is a utility for gathering the public ssh host keys of a number of hosts. It was designed to aid in building and verifying ssh_known_hosts files.

Tipo de chave

O tipo de chave a ser buscada é especificado usando a opção -t .

  • rsa1 (protocolo obsoleto do SSH versão 1)
  • rsa
  • dsa
  • ecdsa (versões recentes do OpenSSH)
  • ed25519 (versões recentes do OpenSSH)

Em versões modernas do OpenSSH, os tipos de chave padrão a serem buscados são rsa (desde a versão 5.1), ecdsa (desde a versão 6.0) e ed25519 (desde a versão 6,7).

Com versões anteriores de ssh-keyscan (antes do OpenSSH versão 5.1), o O tipo de chave padrão era o rsa1 (Protocolo SSH 1) desatualizado, portanto, os tipos de chave precisaria ser explicitamente especificado:

ssh-keyscan -t rsa,dsa hostname

Obter hashes de impressão digital de chaves Base64

ssh-keyscan imprime a chave do host do servidor SSH em codificado em Base64 formato. Para converter isso em um hash de impressão digital, a utilidade ssh-keygen pode ser usado com sua opção -l para imprimir a impressão digital do público especificado chave.

Se você usar o Bash, o Zsh (ou o shell Korn), o processo substituição pode ser usada para um prático one-liner:

ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)

Nota : Com as versões do OpenSSH anteriores a 7.2, as funções usadas por ssh-keygen para ler arquivos, não manipulou pipes nomeados (FIFOs) muito bem Esse método não funcionaria, exigindo o uso de arquivos temporários.

Algoritmos de hash

Versões recentes dos hashes de impressão digital ssh-keygen print SHA256 das chaves. Para obter hashes MD5 das impressões digitais da chave do servidor (o comportamento antigo), o -E opção pode ser usada para especificar o algoritmo de hash:

ssh-keygen -E md5 -lf <(ssh-keyscan hostname 2>/dev/null)

Usando um pipeline

Se estiver usando um shell POSIX (como dash ) que não possui substituição de processo, as outras soluções usando arquivos temporários funcionarão. No entanto, com versões mais recentes do OpenSSH (desde 7.2), um pipeline simples pode ser usado desde que ssh-keygen aceita - como um nome de arquivo para o fluxo de entrada padrão, permitindo uma linha comando de pipeline.

ssh-keyscan hostname 2>/dev/null | ssh-keygen -E md5 -lf -
    
por 09.03.2016 / 17:13
20

nmap fornece essa capacidade usando o script ssh-hostkey .

Para retornar a impressão digital hexadecimal da chave:

$ nmap [SERVER] --script ssh-hostkey

Para retornar o conteúdo da chave:

$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=full

Para devolver a bolha visual da chave

$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey='visual bubble'

Para retornar todos os itens acima:

$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=all

Fonte: documentos do nmap

    
por 28.04.2014 / 16:19
2

filezilla exibe as chaves com o formato md5 em formato hexadecimal .

para encontrar isto na sua máquina ubuntu linux use este comando:

ssh-keygen -l -E md5 -f <(ssh-keyscan localhost 2>/dev/null)

nota: substitua "localhost" pelo ip da máquina que você deseja verificar.

    
por 27.09.2017 / 18:40
0

Aqui está um script de shell (principalmente o shell Bourne, mas usando local keyword, que está disponível na maioria dos /bin/sh modernos) que escrevi para fazer isso. Use como ssh-hostkey hostname . Ele mostrará as impressões digitais do formato sha256 e md5 para todas as teclas de host para o nome de host ou endereço IP fornecido. Você também pode especificar manualmente " md5 " ou " sha256 " como o segundo argumento para mostrar apenas esse formato específico.

Ele usa um arquivo temporário em vez de canalizar para torná-lo compatível com pacotes OpenSSH mais antigos (conforme descrito em outras respostas). O arquivo temporário usa /dev/shm (memória compartilhada), se disponível.

#!/bin/sh
usage () {
  printf '%s\n' "Usage: ssh-hostkey HOSTNAME [FPRINTHASH]"
}

ssh_hostkey () {
  local host="$1"
  local fprinthash="$2"
  local tmp=

  case "$host" in
    -h|--help|'')
      usage >&2
      return 1
      ;;
  esac

  case "$fprinthash" in
    md5|sha256|'') true;;
    *)
      usage >&2
      printf '%s\n' "Fingerprint hash may be 'md5' or 'sha256'" >&2
      return 2
      ;;
  esac

  if test -d /dev/shm
  then tmp="$(mktemp -d -p /dev/shm)"
  else tmp="$(mktemp -d)"
  fi

  trap 'trap - INT TERM EXIT; rm -rf "$tmp"' INT TERM EXIT
  ssh-keyscan "$host" > "$tmp/f" 2> /dev/null
  case "$fprinthash" in
    sha256|'') ssh-keygen -l -f "$tmp/f" 2> /dev/null;;
  esac
  case "$fprinthash" in
    md5|'') ssh-keygen -l -E md5 -f "$tmp/f" 2> /dev/null;;
  esac

  trap - INT TERM EXIT
  rm -rf "$tmp" > /dev/null 2>&1
}

ssh_hostkey "$@"
    
por 22.02.2018 / 02:43

Tags