Como verificar se um par de chaves pública / privada RSA corresponde

72

Eu tenho dois arquivos id_rsae id_rsa.pub. Qual comando pode ser usado para validar se eles são um par válido ?

Ryan
fonte
Vou confirmar a resposta de Michuelnik; isso me salvou de ter que fazer um novo par de chaves, obrigado. ssh -vajuda muito também.
Chris K

Respostas:

93

Prefiro o ssh-keygen -y -e -f <private key>caminho do que a resposta aceita de Como você testa um par de chaves DSA público / privado? no estouro de pilha.

ssh-keygen -y -e -f <private key>pega uma chave privada e imprime a chave pública correspondente, que pode ser diretamente comparada às suas chaves públicas disponíveis. (Dica: cuidado com os comentários ou as opções principais).

(Como diabos está fazendo isso? Só espero que a chave pública seja codificada direta ou indiretamente na chave privada ...)

Eu mesmo precisava disso e usei a seguinte linha única do Bash. Não deve produzir nada se as chaves estiverem juntas. Aplique um pouco -qao diff nos scripts e o diff apenas define o código de retorno adequadamente.

PRIVKEY=id_rsa
TESTKEY=id_rsa.pub
diff <( ssh-keygen -y -e -f "$PRIVKEY" ) <( ssh-keygen -y -e -f "$TESTKEY" )
Michuelnik
fonte
11
@ MichaelHampton: agora eu entendo o seu comentário. "a resposta aceita" deve referir-se à pergunta sobre stackoverflow não esta pergunta ...
Michuelnik
11
@ Sirch: Eu pensei que a decisão de qual chave é privada e qual é pública é pura aleatória, pois as duas chaves são iguais. O que uma chave criptografa pode ser descriptografado apenas com a outra. E se uma chave pudesse ser obtida da outra, tudo isso não daria certo.
Michuelnik 25/09
11
@ Micheluelnik Você pode derivar a chave pública da chave privada. Você não pode derivar a chave privada da chave pública. Não estávamos falando sobre o material que ele criptografa.
Sirch
11
@ Michuelnik imho, a questão está fora do tópico sobre SO e sobre o tópico aqui (e / ou superusuário). imho, não deve ser marcado como duplicado e sinalizado para migração. Mas é abordado em ambos, então eu gosto do compartilhamento mais completo de informações.
Chris K
10
Enquanto o id_rsa.pub existir, ssh-keygen -y -e -f id_rsaele não verificará o id_rsa, mas apenas retornará o valor de id_rsa.pub. Então, por exemplo, se você echo 5 > id_rsaapagar a chave privada, faça o diff, o diff passará! Além disso, a execução em ssh-keygen -yef fooque foo não é uma chave válida (e não possui foo.pub correspondente) bloqueará a espera pela entrada do usuário; portanto, tenha cuidado ao usar isso em um script.
32

Dependendo de onde você obtém o arquivo de chave pública que está testando, a resposta aceita pode fornecer resultados positivos falsos. Isso ocorre devido ao comportamento descrito no comentário de @drewbenn. Especificamente, quando a opção -e é usada com o arquivo de chave privada como o parâmetro de opção -f, ele simplesmente repete (mas reformata) o que está no arquivo de chave pública associado.

Em outras palavras,

ssh-keygen -y -f id_rsa

(aparentemente) gera o valor da chave pública e

ssh-keygen -y -e -f id_rsa

simplesmente e gera (e reformata) a chave no id_rsa.pub existente, seja ele qual for .

No meu caso, tenho que verificar se o par não foi corrompido. Então, decidi comparar o seguinte:

ssh-keygen -y -f id_rsa | cut -d' ' -f 2

com

cut -d' ' -f 2 id_rsa.pub

Portanto:

diff <(cut -d' ' -f 2 id_rsa.pub) <(ssh-keygen -y -f id_rsa | cut -d' ' -f 2)

Talvez isso não seja tão flexível, mas seja melhor para minhas necessidades. Talvez ajude alguém.

twildfarmer
fonte
5
Isso realmente deve substituir a resposta aceita ou pelo menos superá-la em termos de votos.
Thomanski
Obrigado! Este comando não funciona com chaves com uma senha, não solicita isso de forma interativa. Eu extraí o conteúdo do comando two () para os arquivos e os diferenciei, isso funciona.
Yaroslav Nikitenko
5

Se eles estão em seu sistema local, ficar id_rsa.pubna sua $HOME/.ssh/authorized_keyse sshpara localhostusar a id_rsachave. Se funcionar, eles correspondem.

cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
ssh -i $HOME/.ssh/id_rsa localhost
Michael Hampton
fonte