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 ...

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.


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.


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.


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.


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.


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.


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)


Eu acho que você deve elaborar, seu post é realmente perto stackoverflow.com/a/22595408/3102264
— mpromonet


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.


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.


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

-2

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


1
isto não permite testar par de chaves público-privada
— MatFiz
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.