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 :
openssl dgst -sign ~/.ssh/id_rsa some-file
O outro está usando pkeyutl :
openssl pkeyutl -sign -inkey ~/.ssh/id_rsa -in some-file
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:
openssl dgst -verify $PUBLIC_KEY_FILE -signature signature-file some-file
e:
openssl pkeyutl -verify -inkey $PUBLIC_KEY_FILE -sigfile signature-file -in some-file
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 usar id_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:
ssh-keygen -e -f ~/.ssh/id_rsa.pub -m pem
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:
openssl rsa -in ~/.ssh/id_rsa -pubout
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.