O que é uma impressão digital de chave SSH e como é gerada?

129

Sempre acho que recebo essa mensagem quando entro sshem uma nova máquina:

12:f8:7e:78:61:b4:bf:e2:de:24:15:96:4e:d4:72:53

O que significa? Todas as máquinas terão sempre a mesma impressão digital?

Como essas impressões digitais são geradas? De quais parâmetros eles dependem?

Kit Ho
fonte

Respostas:

65

A impressão digital é baseada na chave pública do host, geralmente baseada em "/etc/ssh/ssh_host_rsa_key.pub" Geralmente é para facilitar a identificação / verificação do host ao qual você está se conectando.

Se a impressão digital mudar, a máquina à qual você está se conectando alterou sua chave pública. Isso pode não ser uma coisa ruim (acontece na reinstalação do ssh), mas também pode indicar que você está se conectando a uma máquina diferente no mesmo domínio / IP (acontece quando você está se conectando através de algo como o balanceador de carga) ou que você estão sendo direcionados com um ataque man-in-the-middle, em que o invasor de alguma forma intercepta / redireciona sua conexão ssh para conectar-se a um host diferente que pode estar espionando seu usuário / pw.

Conclusão: se você for avisado sobre uma impressão digital alterada, tenha cuidado e verifique se está realmente se conectando ao host correto por uma conexão segura. Embora na maioria das vezes isso seja inofensivo, pode ser uma indicação de um possível problema

Veja: http://www.lysium.de/blog/index.php?/archives/186-How-to-get-ssh-server-fingerprint-information.html
e: http://en.wikipedia.org/ wiki / Public_key_fingerprint

madmaze
fonte
5
"... seja cauteloso e verifique se você está realmente se conectando ao host correto por uma conexão segura" - pergunta estúpida, mas como você pode fazer isso facilmente?
Savara
1
@ Savara Quando você estiver se conectando a um servidor SSH que não estava conectado antes, solicite a chave pública do servidor SSH ao administrador do servidor. O administrador do servidor fornecerá um pedaço de texto. Você deve anexar este texto ao arquivo ~/.ssh/known_hosts. Dessa forma, quando você se conectar ao servidor, seu cliente SSH reconhecerá esse servidor, desde que você salvou sua chave pública known_hosts. Portanto, você nunca deve dizer "sim" quando o cliente SSH informar "A autenticidade do host não pode ser estabelecida". Você sempre deve adicionar a chave pública do servidor com antecedência.
Utku
@ Savara Se você fizer isso, saberá que algo suspeito está acontecendo quando seu cliente SSH diz "A autenticidade do cliente não pode ser estabelecida" ou quando diz "A chave pública do servidor foi alterada". Portanto, você sempre deve adicionar a chave pública do servidor ao seu ~/.ssh/known_hostsarquivo com antecedência e nunca dizer sim quando o cliente SSH informar "A autenticidade do cliente não pode ser estabelecida" ou quando a mensagem "A chave pública do servidor tiver sido alterado ".
Utku 24/03
3
Sim, estou totalmente ciente de como a mecânica de visualização das impressões digitais SSH funciona, mas em uma grande porcentagem do tempo você não tem a opção de obter a impressão digital em outro canal. Infelizmente, o TOFU é o melhor que costumamos receber.
Savara 25/03
Existe uma maneira de verificar a autenticidade mesmo depois de responder "sim"?
troca
104

Você pode gerar uma impressão digital para uma chave pública usando ssh-keygeno seguinte:

ssh-keygen -lf /path/to/key.pub

Exemplo concreto (se você usar uma chave pública RSA):

$ ssh-keygen -lf ~/.ssh/id_rsa.pub
2048 00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff /Users/username/.ssh/id_rsa.pub (RSA)

A primeira parte (2048)é o comprimento da chave em bits, a segunda parte (00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff)é a impressão digital da chave pública e a terceira parte é o local do próprio arquivo de chave pública.

Benjamin Oakes
fonte
você sabe traduzir para esse formato a partir dessa chave pública?
Kit Ho
@KitHo Não sei se entendi sua pergunta. Atualizei o exemplo, pois acho ssh-keygen -lfque fará o que você deseja.
Benjamin Oakes
5
Ao fazer o SSH em uma nova máquina, o que se vê não é a impressão digital pubkey do usuário, mas a impressão digital pubkey do host. Portanto, um exemplo melhor para o contexto da pergunta é ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub. Ele mostra a impressão digital que também é mostrada nos logins do SSH no host local.
tanius
58
Minhas impressões digitais ssh-keygenrelatadas sha256. Para obter md5impressões digitais, corri ssh-keygen -l -E md5 -f ~/.ssh/id_rsa.pub. #archlinux
Justin C
6
(@JustinC) O OpenSSH versões 6.8 (março de 2015) e posterior foi alterado para SHA256, exibido em base64 em vez de hex, por padrão. Para o uso do cliente ssh -o FingerprintHash=md5ou o equivalente em ssh_configcoisas que usam sshcomo scp.
dave_thompson_085
72

A impressão digital é o MD5 sobre os dados binários da chave pública codificada em Base64.

$ ssh-keygen -f foo
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in foo.
Your public key has been saved in foo.pub.
The key fingerprint is:
65:30:38:96:35:56:4f:64:64:e8:e3:a4:7d:59:3e:19 andrew@localhost
The key's randomart image is:
+--[ RSA 2048]----+
|       +*..+*    |
|      =. +.=     |
|     . . .o .    |
|         o+   E  |
|        S= . + o |
|        . o o +  |
|           .   . |
|                 |
|                 |
+-----------------+
$ cat foo.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDEbKq5U57fhzQ3SBbs3NVmgY2ouYZfPhc6cXBNEFpRT3T100fnbkYw+EHi76nwsp+uGxk08kh4GG881DrgotptrJj2dJxXpWp/SFdVu5S9fFU6l6dCTC9IBYYCCV8PvXbBZ3oDZyyyJT7/vXSaUdbk3x9MeNlYrgItm2KY6MdHYEg8R994Sspn1sE4Ydey5DfG/WNWVrzFCI0sWI3yj4zuCcUXFz9sEG8fIYikD9rNuohiMenWjkj6oLTwZGVW2q4wRL0051XBkmfnPD/H6gqOML9MbZQ8D6/+az0yF9oD61SkifhBNBRRNaIab/Np7XD61siR8zNMG/vCKjFGICnp andrew@localhost
$ echo 'AAAAB3NzaC1yc2EAAAADAQABAAABAQDEbKq5U57fhzQ3SBbs3NVmgY2ouYZfPhc6cXBNEFpRT3T100fnbkYw+EHi76nwsp+uGxk08kh4GG881DrgotptrJj2dJxXpWp/SFdVu5S9fFU6l6dCTC9IBYYCCV8PvXbBZ3oDZyyyJT7/vXSaUdbk3x9MeNlYrgItm2KY6MdHYEg8R994Sspn1sE4Ydey5DfG/WNWVrzFCI0sWI3yj4zuCcUXFz9sEG8fIYikD9rNuohiMenWjkj6oLTwZGVW2q4wRL0051XBkmfnPD/H6gqOML9MbZQ8D6/+az0yF9oD61SkifhBNBRRNaIab/Np7XD61siR8zNMG/vCKjFGICnp' \
    | base64 -D | md5
6530389635564f6464e8e3a47d593e19

O md5sum 6530389635564f6464e8e3a47d593e19 é a impressão digital exibida quando a chave é gerada, apenas sem os dois pontos de separação.


No entanto, se você estiver lidando com as impressões digitais mostradas pela Amazon no console do EC2 Key Pairs, infelizmente isso pode ser uma fera diferente . Se for uma sequência hexadecimal de 32 dígitos, é a impressão digital padrão da chave pública SS5 MD5 acima. Mas se tiver 40 dígitos hexadecimais, na verdade é uma impressão digital calculada usando o SHA1 da chave privada no formato PKCS # 8:

$ openssl pkcs8 -in foo -nocrypt -topk8 -outform DER | openssl sha1 -c
e2:77:39:d3:53:a7:62:68:5f:da:82:0e:99:61:30:64:a2:88:c4:58
andrew.n
fonte
1
Achei esta resposta útil no seguinte cenário. Seu sistema usa SHA1 para calcular a impressão digital, mas o de seu amigo usa md5. Compartilhei uma impressão digital que era SHA1 e não correspondia ao MD5 gerado pelo sistema dela. Isso ajudou - obrigado! sed 's | ^ ssh-rsa ||' /etc/ssh/ssh_host_rsa_key.pub | sed 's | ==. * $ | == |' | base64 -d | md5sum
Liczyrzepa 5/15
Isso é altamente relevante para entender por que essa impressão digital não coincide com a dos registros DNS SSHFP, porque eles usam os resumos SHA-1 ou SHA-256.
neirbowj
1
@Liczyrzepa o campo publickey pode ou não ter '==' no final, dependendo do tipo de chave e tamanho de bits; mais seguro e IMO mais fácil de usar awk '{print $2}' /path/to/keyfile.pubou similar.
dave_thompson_085
13
Esta é a única resposta que explica como a impressão digital é calculado
greuze
2
No entanto, no Linux Mint o comando é:cat id_rsa.pub | cut -d' ' -f2 | base64 -d | md5sum
greuze
13

Se você deseja verificar um arquivo de chave SSH para ver se é o mesmo que é relatado como "Chave de implantação" pelo github, este é para você ...

Na URL privada: https://github.com/<username>/<repo_name>/settings/keys, você verá captura de tela do github

No terminal:

$ ls -l id*
-rw-------  1 bruno  staff  1675 Mar 29 17:03 id_rsa
-rw-r--r--  1 bruno  staff   416 Mar 29 17:03 id_rsa.pub

$ ssh-keygen -E md5 -lf id_rsa
2048 MD5:07:b4:00:a4:65:ef:44:89:05:84:60:0c:c9:b2:36:5e [email protected] (RSA)

$ ssh-keygen -E md5 -lf id_rsa.pub
2048 MD5:07:b4:00:a4:65:ef:44:89:05:84:60:0c:c9:b2:36:5e [email protected] (RSA)

Você notará que obtém a mesma impressão digital para as chaves pública e privada.

Esse mesmo comando pode ser combinado com um recurso interessante do GitHub, que é o fato de que eles veiculam publicamente as chaves públicas SSH dos usuários em https://github.com/<username>.keys

Aqui está uma lista que você pode usar para tirar vantagem disso.

$ curl -sL https://github.com/RichardBronosky.keys | while read; do echo -e "\nkey #$((++i)):"; ssh-keygen -E md5 -lf - <<<"$REPLY"; echo $REPLY; done

key #1:
2048 MD5:07:b4:00:a4:65:ef:44:89:05:84:60:0c:c9:b2:36:5e no comment (RSA)
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJGT35gvsFveu+80qgurrLHId0h55E9jliM7Fo0mV9b7eg3EfyagkAcJUSMFkoov3HY4CW0yzOc7WlN57ABwvpRz1ioFDex0n0FkjoSEs5ROeT1OneRK6Bf6XnplgPuQ/LSSkv3kmK6I29R+YWi6TjDvLLoA5BrXJjOMfUv36jxWCDtk/5ZdhMZqhsMuDm06Jg5JBu6n5jQaZkmaIaunz7vOfwVG9LoCI+MYyIdo2S4VTva7Ee7jfAvgSUUgHTjhzsPO0/Ww5a/Kz2ehXW27aJxj/QPLfYR2LmTMbQKm3WpB8P1LjoiU7zjPoVoZ43a4P2JLUDidGKCd3eY5b5xewz

key #2:
2048 MD5:f7:98:f1:0b:73:c6:2a:21:00:7a:70:1d:0f:cf:d8:cc no comment (RSA)
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCQsZrjwKjB4WnE4SwVdDX5eEMxKzPHFBVKKpo9vvWUXRQwdTZy6iVOkyF26IPR+xDPzslzXOClKXUrWEh6La/EMpRwuMrWAbMIJFeDHOb56q4azgopoJmMJHo0yxGu0Ts4XszMACYRhlG6uK2AP5SYiOTp1zKPFjazXAdwLXyOvJurzy6KKuGJdSs/sj9+4uehgyRNOhehCSfg71tJJYwRvO2DDfLgaVEKOgZx58gEnJfhhz9D7rbvdZNhw/hCgtVNJaQF9Mdke2OPwWSo8i0/XNb9Bu/GRXqwMZrxDBhyzieocW40cwuzxWfzoi03aISdtQ1HtawH8+/sswviM1+B
Bruno Bronosky
fonte
1
ssh-keygen -r host.name.com

Produzirá as impressões digitais de todas as chaves públicas configuradas em uma instância sshd.

Eles podem ser colocados nos registros DNS SSHFP .

Mike Schroll
fonte