Eu uso o SSH (OpenSSH 5.5p1 no Linux, para ser mais preciso). Eu tenho uma chave, na qual eu tenho uma senha. Eu uso isso para o logon habitual nas coisas de computadores.
Também posso usá-lo para assinar arquivos?
Pelo que entendi, uma chave SSH é uma chave RSA (ou DSA) e, durante o processo de login do SSH, é usada para assinar mensagens enviadas ao servidor. Portanto, em princípio e na prática, pode ser usado para assinar coisas - de fato, esse é seu único objetivo.
Mas, tanto quanto posso ver, não há como usar a chave para assinar um arquivo arbitrário (como faria com o PGP, por exemplo). Existe alguma maneira de fazer isso?
ssh
digital-signature
Tom Anderson
fonte
fonte
Respostas:
Pode não haver uma maneira de fazer isso apenas com as ferramentas OpenSSH.
Mas isso pode ser feito facilmente com as ferramentas OpenSSL. De fato, existem pelo menos duas maneiras de fazer isso. Nos exemplos abaixo,
~/.ssh/id_rsa
é sua chave privada.Uma maneira é usar o dgst :
O outro está usando pkeyutl :
Ambos escrevem uma assinatura binária na saída padrão. O dgst assume uma
-hex
opção imprimirá uma representação textual, com alguns detalhes sobre a forma da assinatura. O pkeyutl aceita uma-hexdump
opção que é um pouco menos útil. Ambos aceitarão as chaves RSA e DSA. Não tenho idéia de qual é o formato da saída. Os dois comandos produzem formatos diferentes. Tenho a impressão de que o pkeyutl é considerado mais moderno que o dgst .Para verificar essas assinaturas:
e:
O problema aqui é
$PUBLIC_KEY_FILE
. O OpenSSL não pode ler o formato da chave pública do OpenSSH; portanto, você não pode simplesmente usarid_rsa.pub
. Você tem algumas opções, nenhuma ideal.Se você possui uma versão do OpenSSH da versão 5.6 ou posterior, aparentemente você pode fazer o seguinte:
O qual gravará a chave pública na saída padrão no formato PEM, que o OpenSSL pode ler.
Se você possui a chave privada e é uma chave RSA, pode extrair a chave pública dela (suponho que o arquivo de chave privada codificado por PEM inclua uma cópia da chave pública, pois não é possível derivar a chave pública da própria chave privada) e use isso:
Não sei se existe um equivalente DSA. Observe que essa abordagem requer alguma cooperação do proprietário da chave privada, que precisará extrair a chave pública e enviá-la ao pretenso verificador.
Por fim, você pode usar um programa Python escrito por um sujeito chamado Lars para converter a chave pública do formato OpenSSH para OpenSSL.
fonte
A resposta de @ Tom ajudou-me a começar, mas não funcionou imediatamente.
Esses comandos funcionarão com:
Usando pkeyutl
Usando dgst
A versão pkeyutl pode assinar apenas arquivos pequenos. Enquanto o dgst pode assinar arquivos arbitrariamente grandes, porque é necessário digerir antes de assinar o resultado.
fonte
Para verificar essas assinaturas - solução mais fácil:
A maneira mais fácil de garantir que um documento assinado seja o mesmo, é gerar novamente o arquivo de assinatura digital e usar diff para verificar se os dois arquivos de assinatura são iguais.
fonte