Converti minha id_rsa
chave privada para o formato RSA usando
ssh-keygen -p -m PEM -f ~/.ssh/id_rsa
explicado nesta resposta .
Em seguida, adicionei alguns aliases úteis que me permitirão criptografar e descriptografar dados com meus próprios arquivos de identidade:
alias encrypt='openssl pkeyutl -encrypt -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256 -pubin -inkey <(ssh-keygen -e -f "$HOME/.ssh/id_rsa.pub" -m PKCS8)'
alias decrypt='openssl pkeyutl -decrypt -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256 -inkey "$HOME/.ssh/id_rsa"'
Agora posso fazer:
echo foobar | encrypt > test.enc
cat test.enc | decrypt
Ele será impresso foobar
, mas test.enc
poderá ser armazenado sem exposição foobar
. Certamente existem maneiras melhores de fazer isso, mas a razão pela qual tento fazer isso é para me livrar de qualquer solicitação de senha.
O meu id_rsa
é protegido por senha, mas inicio minha sessão de terminal com ssh-add
a qual solicita minha senha de senha apenas uma vez, para que, quando eu usar ssh
(incluindo git
), não precise inserir minha senha novamente.
Porém, o mesmo não pode ser dito do openssl pkeyutl -decrypt
, ele solicitará uma senha sempre que eu usá-lo, o que faz sentido, pois openssl
é a ferramenta subjacente usada pelo openssh
.
Independentemente disso, existe alguma maneira de usar a ssh-add
sessão para openssl
?
Você o converteu para o formato PEM ou PKCS#8. Sempre foi uma chave RSA, apenas o encapsulamento mudou.
Não, não há. O agente ssh não fornece acesso à chave privada bruta – ele apenas fornece a capacidade de realizar certas operações com ela, como o software equivalente a um cartão inteligente ou Yubikey. Especificamente, fornece uma operação de 'sinal', mas não uma operação de 'descriptografia'.
(Afinal, seu objetivo principal é ser usado para SSHv2 – que realmente não faz nenhuma descriptografia de chave privada; assinar é tudo o que precisa.)
Você poderia usar o GnuPG com seu agente gpg como alternativa - a ferramenta 'gpg' lida principalmente com arquivos no formato PGP, mas também vem com 'gpgsm' para o formato CMS que é próximo ao que o OpenSSL produz.
Mas mesmo que você queira apenas assinar, o OpenSSL também não suporta o uso do ssh-agent para isso. (Nenhuma razão fundamental para isso; simplesmente não está implementado. Provavelmente favoreceria o PKCS # 11 como interface; p11-kit + softhsm pode ser transformado em uma espécie de "agente openssl".
E se a situação não exigir especificamente uma assinatura no formato PKCS#7/CMS/SMIME, existem alternativas – OpenSSH vem com seu próprio formato de assinatura que você pode encontrar em 'ssh-keygen'; e é muito fácil escrever uma ferramenta Python personalizada que assine coisas através do ssh-agent, usando o módulo 'paramiko'.)
Geralmente também não é recomendado usar a mesma chave para funções diferentes – embora seja tecnicamente possível que a mesma chave RSA seja usada para assinaturas e criptografia, os especialistas em criptografia geralmente desaconselham fazê-lo por precaução.