Por que minha impressão digital da chave OpenSSH não corresponde à impressão digital do par de chaves do console do AWS EC2?

64

Quando importo minha chave pública OpenSSH para o chaveiro do AWS EC2, a impressão digital mostrada pela AWS não corresponde ao que eu vejo:

ssh-keygen -l -f my_key

É um tamanho diferente e tem bytes diferentes.

Por quê? Tenho certeza de que enviei a chave correta.

    
por Craig Ringer 10.06.2014 / 06:28

7 respostas

94

O AWS EC2 mostra a impressão digital do SSH2, não a impressão digital do OpenSSH que todos esperam. Não diz isso na interface do usuário.

Ele também mostra dois tipos diferentes de impressões digitais dependendo se a chave foi gerada na AWS e baixada, ou se você fez upload da sua própria chave pública.

Impressões digitais geradas com

ssh-keygen -l -f id_rsa

não corresponde ao que o EC2 mostra. Você pode usar as ferramentas da API da AWS para gerar uma impressão digital com o comando ec2-fingerprint-key ou usar o OpenSSL para fazê-lo.

Se originalmente você gerou uma chave na AWS, mas fez o upload dela novamente (digamos, para outra região), receberá uma impressão digital diferente porque a impressão digital SSH2 RSA será necessária , em vez do sha1 mostrado para as chaves geradas na AWS.

Diversão, ei?

Acima,test-generatedfoigeradousandooAWSEC2.test-generated-reuploadedéachavepúblicadachaveprivadageradapelaAWS,extraídacomssh-keygen-yecarregadanovamente.Aterceirachave,test-uploaded,éumachavegeradalocalmente...masaimpressãodigitalssh-keygen-llocaléb2:2c:86:d6:1e:58:c0:b0:15:97:ab:9b:93:e7:4e:ea.

$ssh-keygen-l-ftheprivatekey2048b2:2c:86:d6:1e:58:c0:b0:15:97:ab:9b:93:e7:4e:ea$opensslpkey-intheprivatekey-pubout-outformDER|opensslmd5-cEnterpassphraseforid_landp:(stdin)=91:bc:58:1f:ea:5d:51:2d:83:d3:6b:d7:6d:63:06:d2

Chavesgeradaslocalmente

VocêpodeusaroOpenSSL,como demonstrado por Daniel nos fóruns da AWS , para gerar a impressão digital no formato usado pela AWS para mostrar impressões digitais de chaves públicas carregadas (SSH2 MD5), como:

7a:58:3a:a3:df:ba:a3:09:be:b5:b4:0b:f5:5b:09:a0

Eles podem ser gerados por meio da extração da parte pública da chave privada e do hashing usando:

openssl pkey -in id_rsa -pubout -outform DER | openssl md5 -c

Chaves geradas no AWS

Se a impressão digital da chave mostrada no console da AWS for maior, ela será uma chave privada gerada na AWS, como:

ea:47:42:52:2c:25:43:76:65:f4:67:76:b9:70:b4:64:12:00:e4:5a

Nesse caso, você precisa usar o seguinte comando, também mostrado por Daniel nos fóruns da AWS, para gerar um hash sha1 com base na chave privada:

openssl pkcs8 -in aws_private.pem -nocrypt -topk8 -outform DER | openssl sha1 -c

no arquivo de chave privada / certificado gerado pelo AWS. Ele funcionará nas teclas que você converteu para o formato OpenSSH também.

Referências

Veja:

por 10.06.2014 / 06:28
9

Se você tiver apenas chaves públicas, poderá gerar a impressão digital da AWS da seguinte forma:

ssh-keygen -e -f id_rsa.pub -m pkcs8 | openssl pkey -pubin -outform der | openssl md5 -c
    
por 17.02.2017 / 14:28
2

Há um recurso sobre o link da documentação da AWS

Se você criou seu par de chaves usando a AWS, pode usar as ferramentas OpenSSL para gerar uma impressão digital a partir do arquivo de chave privada:

Copiar

$ openssl pkcs8 -in path_to_private_key -inform PEM -outform DER -topk8 -nocrypt | openssl sha1 -c

Se você criou seu par de chaves usando uma ferramenta de terceiros e enviou a chave pública para a AWS, é possível usar as ferramentas OpenSSL para gerar uma impressão digital a partir do arquivo de chave privada em sua máquina local:

Copiar

$ openssl rsa -in path_to_private_key -pubout -outform DER | openssl md5 -c

A saída deve corresponder à impressão digital exibida no console.

    
por 20.06.2017 / 10:27
1

Para aqueles de nós usando o Python

from Crypto.PublicKey import RSA
import hashlib
import base64

#Load your key from disk, or a string, or generate.
my_key = RSA.importKey(open(my_rsa_private_key, 'r').read())

# Normal md5 fingerprint
fp_plain = hashlib.md5(base64.b64decode(my_key.exportKey('OpenSSH').strip().split()[1].encode('ascii'))).hexdigest()
print ':'.join(a+b for a,b in zip(fp_plain[::2], fp_plain[1::2]))

#AWS' EC2 fingerprint
public_only_key = RSA.importKey(my_key.exportKey('OpenSSH'))
fp_plain = hashlib.md5(public_only_key.exportKey('DER')).hexdigest()
print ':'.join(a+b for a,b in zip(fp_plain[::2], fp_plain[1::2]))
    
por 08.02.2017 / 23:37
1

Isso é o que eu uso:

openssl rsa -RSAPublicKey_in -in <(ssh-keygen -f ~/.ssh/id_rsa.pub -e -m PEM) -inform PEM -outform DER 2>/dev/null | openssl md5 -c | awk '{print $2}'

Isso gera a impressão digital a partir da chave pública, semelhante a algumas das opções acima.

    
por 10.09.2017 / 15:29
1
#!/bin/bash
key_file=$1
if [[ -n $key_pub_file ]]; then
    ssh-keygen -e -f $key_pub_file -m pkcs8 | openssl pkey -pubin -outform der | openssl md5 -c
else
    echo "pass the pub file as argument"
fi

Aqui está um script que eu uso, adicione o caminho do script para env. Obrigado a J.Doe pela resposta

    
por 25.06.2018 / 08:59
0

Apenas no caso de isso ser útil: link

por exemplo:

$ ssh-vault -u bob -f

Imprimirá a impressão digital do usuário bob correspondente ao formato que a AWS está usando.

    
por 10.10.2016 / 17:05