Impressão digital da chave ssh PEM

30

Eu tenho um arquivo PEM que adiciono a um ssh-agent em execução:

$ file query.pem
query.pem: PEM RSA private key

$ ssh-add ./query.pem
Identity added: ./query.pem (./query.pem)

$ ssh-add -l | grep query
2048 ef:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX ./query.pem (RSA)

Como posso obter a impressão digital da chave (que vejo no ssh-agent) diretamente do arquivo? Eu sei que ssh-keygen -l -f some_keyfunciona para chaves ssh "normais", mas não para arquivos PEM.

Se eu tentar ssh-keygen no arquivo .pem, obtenho:

$ ssh-keygen -l -f ./query.pem                                             
key_read: uudecode PRIVATE KEY----- failed
key_read: uudecode PRIVATE KEY----- failed
./query.pem is not a public key file.

Essa chave começa com:

-----BEGIN RSA PRIVATE KEY-----
MIIEp.... etc.

ao contrário de uma chave privada "regular", que se parece com:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,E15F2.... etc.
Desconhecido
fonte
Por que você acha que isso não funciona para arquivos PEM? Que erro você recebe ao tentar? Um .ssh/id_rsaarquivo gerado pelo OpenSSH usando todos os padrões É um arquivo PEM. As chaves privadas são codificadas por PEM por padrão. De fato, você pode usar chaves RSA geradas com o OpenSSL diretamente com o OpenSSH.
Zoredache
descrição atualizada com saída de ssh-keygen no .pem
Unknown
(atrasado mas necroed) @Zoredache: Antes da versão 7.2 (em 2016, após este Q) ssh-keygen -lnão era possível ler um arquivo de chave privada, embora outras operações ssh-keygen(e ssh*) o façam. Mas quando ssh-keygen gera uma chave, ele grava o arquivo de chave privada, por exemplo, id_rsa e um arquivo de chave pública correspondente, com o .pubacréscimo de id_rsa.pub. Mais velho ssh-keygen -l vai tentar adicionar .pubao nome do arquivo que você especificar e ler esse arquivo publickey.
dave_thompson_085

Respostas:

34

Se você deseja recuperar a impressão digital do seu arquivo de chave pública perdida, é possível recuperá-lo do arquivo de chave privada :

$ ssh-keygen -yf path/to/private_key_file > path/to/store/public_key_file

Então, você pode verificar a impressão digital pública:

$ ssh-keygen -lf path/to/store/public_key_file
2048 SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX user@host (RSA)

Em alguns sistemas mais novos, isso imprime a impressão digital SHA256 da chave. Você pode imprimir a impressão digital MD5 da chave (o formulário de dois pontos) usando a opção -E:

$ ssh-keygen -E md5 -lf path/to/store/public_key_file
2048 MD5:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx user@host (RSA)

Ou como uma linha de comando :

$ ssh-keygen -yf /etc/ssh/ssh_host_ecdsa_key | ssh-keygen -E md5 -lf -
2048 MD5:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx user@host (RSA)
ominug
fonte
A resposta de @ MikeD é na verdade a resposta "correta" para o que o OP estava procurando (e o que eu estava procurando). A AWS fornece a impressão digital no formato que ele mostrou, com os pares de dígitos separados por dois pontos. Sua solução (retirada da página fornecida pela AWS) também gera a impressão digital da mesma maneira, para que você possa verificar corretamente.
Mike Williamson
50

A " Verificação da impressão digital do seu par de chaves " da AWS fornece duas linhas únicas que resolvem o problema, dependendo de como sua chave foi criada.

Se você criou seu par de chaves usando a AWS:

$ openssl pkcs8 -in query.pem -inform PEM -outform DER -topk8 -nocrypt | openssl sha1 -c
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx

Ou, se você criou seu par de chaves com uma ferramenta de terceiros:

$ openssl rsa -in query.pem -pubout -outform DER | openssl md5 -c
writing RSA key
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx

(impressões digitais redigidas na saída acima)

Mike D
fonte
6

Aqui está um liner que deve fazer o que você deseja, sem exigir a criação de um arquivo de chave pública localmente.

$ ssh-keygen -lf /dev/stdin <<< $( ssh-keygen -f ~/.ssh/keyname.pem -y )
2048 14:df:c7:b7:f1:26:7f:87:d5:e7:10:6c:ac:af:a2:03 /dev/stdin (RSA)

Isso usa a cadeia bash here <<<para que o stdin esteja disponível como um arquivo regular ( /dev/stdin) em vez de um pipe, pois ssh-keygensó funcionará em um arquivo.

A partir da versão 7.2 do openssh ssh-keygen suporta impressão digital a partir da entrada padrão:

  • ssh-keygen (1): permite impressões digitais a partir da entrada padrão, por exemplo, "ssh-keygen -lf -"

Observe que este comando será interrompido com chaves privadas que usam uma senha e não estão usando um agente. Ele deve funcionar com arquivos pem gerados pela AWS ou OpenStack que não usam senhas.

Consulte https://stackoverflow.com/questions/2635360/ssh-keygen-accepting-stdin para obter mais informações.

htaccess
fonte
As notas de versão não disseram, mas de acordo com a fonte a partir do 7.2 -ltambém suporta a leitura de um arquivo de chave privada (mas não do stdin).
dave_thompson_085
2

Você não obtém a impressão digital do arquivo de chave privada, mas do arquivo de chave pública.

De fato, o ssh-keygen já lhe disse isso:

./query.pem não é um arquivo de chave pública.

Execute-o contra a metade pública da chave e deve funcionar.

De um modo mais geral

Pense nisso: o motivo da impressão digital existir é que você pode identificar a chave pública. De fato, obter um hash da chave privada é um possível problema de segurança, além de inútil para o servidor (que nem sequer possui a chave privada em questão).

Depois de ter a chave pública, o processo é verificar se o cliente está retendo a metade privada correspondente. Como você já sabe quais chaves está tentando verificar, não precisa da impressão digital.

Stephane
fonte
O problema é que eu não tenho uma chave pública para essa privada :( E outra coisa, ssh-keygenfunciona em um arquivo de chave privada RSA que possui informações extras no início (veja minha postagem inicial), mas não nesta. .
Desconhecido
Então não há nada que você possa fazer sobre isso. Você não pode obter a metade pública da chave da parte privada, assim como não pode fazer o inverso.
Stephane
3
Isso está incorreto. Como o @ominug apontou acima, ssh-keygen -yffaz isso.
9788 Steve Jobs
4
@Stephane Embora correto em um nível puro de RSA, na prática, como as chaves são armazenadas na especificação do PKCS, o formato das chaves privadas na verdade inclui as duas chaves. Compare as especificações para privado e público
Håkan Lindqvist
"Você não pode obter a metade pública da chave da parte privada ..." - oh sim, você provavelmente pode. Pegue o módulo da chave privada e use 65537 como expoente público, e é provável que você tenha encontrado a chave pública.
Jim Flood