Como você testa um par de chaves DSA público / privado?

167

Existe uma maneira fácil de verificar se uma determinada chave privada corresponde a uma determinada chave pública? Eu tenho alguns arquivos * .pub e alguns * .key, e preciso verificar quais são os quais.

Novamente, esses são arquivos de publicação / chave, DSA.

Eu realmente preferiria um tipo de one-liner ...

Loki
fonte

Respostas:

259

Eu encontrei uma maneira que parece funcionar melhor para mim:

ssh-keygen -y -f <private key file>

esse comando produzirá a chave pública para a chave privada fornecida, então compare a saída com cada arquivo * .pub.

Loki
fonte
2
o que isso faz exatamente? Por que ssh?
31516 sammiwei
2
provavelmente porque ele está usando pares de chaves para autenticação ssh
etarion
2
No meu caso, um servidor de trabalho central possui algumas dezenas de id_rsa.pub.blahhostarquivos e eu não sabia qual deles correspondia à id_rsachave privada única e estou configurando scp sem senha para poder migrar de sites antigos. Criar um novo par de chaves não é uma opção; Eu tenho minhas chaves bem configuradas e não vou estragar tudo.
Chris K
1
Esta solução parece funcionar para todos os tipos de chaves SSH. Eu até consegui recuperar uma chave pública extraviada com essa abordagem.
Jari Turkia
53

Eu sempre comparo um hash MD5 do módulo usando estes comandos:

Certificate: openssl x509 -noout -modulus -in server.crt | openssl md5
Private Key: openssl rsa -noout -modulus -in server.key | openssl md5
CSR: openssl req -noout -modulus -in server.csr | openssl md5

Se os hashes corresponderem, esses dois arquivos serão combinados.

Robert
fonte
48

Para chaves DSA, use

 openssl dsa -pubin -in dsa.pub -modulus -noout

para imprimir as chaves públicas,

 openssl dsa -in dsa.key -modulus -noout

para exibir as chaves públicas correspondentes a uma chave privada e compará-las.

Martin v. Löwis
fonte
18

Supondo que você tenha as chaves públicas nos certificados x.509 e supondo que sejam chaves RSA, para cada chave pública, faça

    openssl x509 -in certfile -modulus -noout

Para cada chave privada, faça

    openssl rsa -in keyfile -modulus -noout

Em seguida, combine as teclas por módulo.

Martin v. Löwis
fonte
17

A verificação pode ser facilitada com diff:

diff <(ssh-keygen -y -f <private_key_file>) <public key file>

A única coisa estranha é que o diff não diz nada se os arquivos forem iguais, portanto, você será informado apenas se o público e o privado não corresponderem.

John D.
fonte
3
Para obter a saída quando os arquivos coincidirem:diff -s
Roland
3
Esta é uma excelente resposta. (1) diff -qsretorna uma resposta "idêntica / não idêntica" simples. (2) você deve excluir o comentário no arquivo de chave pública antes de executar a diff.
emory
7

Exclua as chaves públicas e gere novas a partir das chaves privadas. Mantenha-os em diretórios separados ou use uma convenção de nomenclatura para mantê-los diretos.

Bill the Lizard
fonte
3
A questão é perguntar como verificar, e o dispositivo em que iremos verificá-lo pode não ter recursos para gerar um novo.
ArmenB
5

Digite o seguinte comando para verificar se uma chave privada e uma chave pública são um conjunto correspondente (idêntico) ou não (um conjunto correspondente) (diferente) no diretório $ USER / .ssh. O comando recortar impede que o comentário no final da linha na chave pública seja comparado, permitindo que apenas a chave seja comparada.

ssh-keygen -y -f ~/.ssh/id_rsa | diff -s - <(cut -d ' ' -f 1,2 ~/.ssh/id_rsa.pub)

A saída será semelhante a uma dessas linhas.

Files - and /dev/fd/63 are identical

Files - and /dev/fd/63 differ

Eu escrevi um shell script que os usuários usam para verificar a permissão de arquivos ~ / .ssh / e o conjunto de chaves correspondentes. Ele resolve meus desafios com incidentes de usuários que configuram o ssh. Isso pode ajudá-lo. https://github.com/BradleyA/docker-security-infrastructure/tree/master/ssh

Nota: Minha resposta anterior (em março de 2018) não funciona mais com as versões mais recentes do openssh. Resposta anterior: diff -qs <(ssh-keygen -yf ~ / .ssh / id_rsa) <(cut -d '' -f 1,2 ~ / .ssh / id_rsa.pub)

Bradley Allen
fonte
Eu acho que você deve elaborar, seu post é realmente perto stackoverflow.com/a/22595408/3102264
mpromonet
Cross postou em Server Fault: Como verificar se um par de chaves pública / privada RSA corresponde #
Peter Mortensen
4

Se você está no Windows e deseja usar uma GUI, com o puttygen, você pode importar sua chave privada para ele:

insira a descrição da imagem aqui

Uma vez importado, você pode salvar sua chave pública e compará-la com a sua.

Zac
fonte
1

Criptografe algo com a chave pública e veja qual chave privada a descriptografa.

Este artigo de projeto de código de Jeff Atwood implementa um wrapper simplificado em torno das classes de criptografia .NET. Supondo que essas chaves foram criadas para uso com o RSA, use a classe assimétrica com sua chave pública para criptografar e o mesmo com sua chave privada para descriptografar.

Mitch Wheat
fonte
Estou procurando algo um pouco mais simples. Digamos, uma casca de um forro ou algo parecido. Estou no linux e tenho o material normal, como o openssl instalado.
Loki
3
Isso é quase tão útil quanto adicionar uma chave pública ao seu arquivo allowed_keys e usar ssh para ver qual chave privada funciona. O método funciona, mas é uma dor.
Bradley Kreider
0

Se não retornar nada, eles correspondem:

cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
ssh -i $HOME/.ssh/id_rsa localhost
RoutesMaps.com
fonte
-2

Basta usar puttygen e carregar sua chave privada nela. Oferece opções diferentes, por exemplo, exportando a chave pública correspondente.

user2987067
fonte
1
isto não permite testar par de chaves público-privada
MatFiz