Existe uma maneira de obter programaticamente uma impressão digital de chave do servidor SSH sem autenticar nela?
Estou tentando ssh -v user@host false 2>&1 | grep "Server host key"
, mas isso trava aguardando uma senha se a autenticação baseada em chave não estiver configurada.
ssh-keygen -l -f - <(ssh-keyscan host)
sim?ssh-keyscan host | ssh-keygen -lf -
ssh-keygen -l -f <(ssh-keyscan host)
ssh-keygen -l -f -
funciona da forma esperada no ssh-keygen 7.2 e superior. Ele produz algumas linhas de comentário para STDERR que podem ser filtradas, conforme mencionado na resposta de Anthony Geoghegan oussh-keyscan host 2>/dev/null | ssh-keygen -l -f -
Recentemente, eu mesmo fiz isso, então pensei em adicionar uma resposta que mostra como isso pode ser feito (com versões do OpenSSH 7.2 ou mais recente ) em uma linha usando a substituição de processo:
O texto a seguir explica como esses comandos funcionam e destaca algumas das diferenças de comportamento entre versões mais antigas e mais recentes dos utilitários OpenSSH.
Buscar chaves de host público
O
ssh-keyscan
comando foi desenvolvido para que os usuários possam obter chaves de host públicas sem precisar se autenticar no servidor SSH. Na sua página de manual:Tipo de chave
O tipo de chave a ser buscada é especificado usando a
-t
opçãorsa1
(Protocolo SSH obsoleto versão 1)rsa
dsa
ecdsa
(versões recentes do OpenSSH)ed25519
(versões recentes do OpenSSH)Nas 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) eed25519
(desde a versão 6.7).Com versões mais antigas de
ssh-keyscan
(antes OpenSSH versão 5.1), o padrão tipo de chave foi o datada-outrsa1
(SSH Protocolo 1) para os principais tipos precisaria ser explicitamente especificadas:Obter hashes de impressão digital das chaves Base64
ssh-keyscan
imprime a chave do host do servidor SSH no formato codificado em Base64 . Para converter isso em um hash de impressão digital, ossh-keygen
utilitário pode ser usado com a-l
opção de imprimir a impressão digital da chave pública especificada.Se você estiver usando o Bash, o Zsh (ou o shell Korn), a substituição do processo pode ser usada para uma única linha:
Nota : Nas versões do OpenSSH anteriores à 7.2, as funções usadas
ssh-keygen
para ler arquivos não processavam muito bem os pipes nomeados (FIFOs), portanto esse método não funcionava, exigindo o uso de arquivos temporários.Algoritmos de hash
Versões recentes dos hashes de
ssh-keygen
impressão digital SHA256 das teclas. Para obter hashes MD5 das impressões digitais da chave do servidor (o comportamento antigo), a-E
opção pode ser usada para especificar o algoritmo de hash:Usando um pipeline
Se estiver usando um shell POSIX (como
dash
) que não possui substituição de processo, as outras soluções que usam arquivos temporários funcionarão. No entanto, com as versões mais recentes do OpenSSH (desde 7.2), um pipeline simples pode ser usado, poisssh-keygen
aceita-
como um nome de arquivo para o fluxo de entrada padrão, permitindo um comando de pipeline de uma linha.fonte
ssh-keygen
nas versões mais antigas do OpenSSH, tenha um problema ao ler o FIFO / pipe nomeado. Vou analisar isso (e atualizar minha resposta) quando tiver algum tempo livre.printf
instruções de depuração nado_fingerprint()
função, descobri que nas versões do OpenSSH anteriores à 7.2, as funções usadasssh-keygen
para ler arquivos, não tratavam muito bem os pipes nomeados (FIFOs), então o método de substituição do processo não funcionaria.nmap
fornece essa capacidade usando ossh-hostkey
scriptPara retornar a impressão digital hexadecimal da chave:
Para retornar o conteúdo da chave:
Para retornar o balão visual da chave
Para retornar todas as opções acima:
Fonte: nmap docs
fonte
-p
opção que pode especificar uma porta, por exemplo-p 22000
. Também é possível usar a-vv
opção de aumentar a verbosidade (quantidade de informação dada)O filezilla exibe chaves com hash com md5 no formato hexadecimal .
Para encontrar isso na sua máquina Linux Linux , use este comando:
nota: substitua "localhost" pelo ip da máquina que você deseja verificar.
fonte
Aqui está um script de shell (principalmente shell Bourne, mas usando a
local
palavra-chave, disponível na maioria dos modernos/bin/sh
) que escrevi para fazer isso. Use-o comossh-hostkey hostname
. Ele mostrará as impressões digitais nos formatos sha256 e md5 para todas as chaves do host para o nome do 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.fonte