我id_rsa
使用以下方法将私钥转换为 RSA 格式
ssh-keygen -p -m PEM -f ~/.ssh/id_rsa
解释这个答案。
然后我添加了一些方便的别名,使我能够使用自己的身份文件加密和解密数据:
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"'
现在我可以这样做:
echo foobar | encrypt > test.enc
cat test.enc | decrypt
它会打印foobar
,但test.enc
可以存储而不暴露foobar
。当然有更好的方法可以做到这一点,但我尝试这样做的原因是为了摆脱任何密码提示。
我的id_rsa
受密码保护,但我启动终端会话时,ssh-add
它仅提示我输入一次密码,这样当我使用ssh
(包括git
)时,我不必再次输入密码。
然而,对于 来说情况并非如此openssl pkeyutl -decrypt
,每当我使用它时,它都会要求输入密码短语,这是有道理的,因为openssl
是 使用的底层工具openssh
。
无论如何,有什么方法可以使用会话ssh-add
吗openssl
?
答案1
我使用以下方法将 id_rsa 私钥转换为 RSA 格式
您将其转换为 PEM 或 PKCS#8 格式。它始终是 RSA 密钥,只是封装发生了变化。
无论如何,有没有办法将 ssh-add 会话用于 openssl?
没有。ssh-agent 不提供对原始私钥的访问 - 它只提供对其执行某些操作的能力,就像智能卡或 Yubikey 的软件等效物一样。具体来说,它提供了“签名”操作,但不是‘解密’操作。
(毕竟,它的主要目的是用于 SSHv2——它实际上并不执行任何私钥解密;它所需要的只是签名。)
您可以使用 GnuPG 及其 gpg-agent 作为替代方案 - “gpg”工具主要处理 PGP 格式的文件,但它还附带用于 CMS 格式的“gpgsm”,与 OpenSSL 生成的格式接近。
但即使您只想签名,OpenSSL 也不支持使用 ssh-agent 进行签名。(没有根本原因;它只是没有实现。它可能倾向于使用 PKCS#11 作为接口;p11-kit + softhsm 可以变成一种“openssl-agent”。
如果情况不特别需要 PKCS#7/CMS/SMIME 格式签名,那么还有其他选择 - OpenSSH 自带了自己的签名格式,您可以在“ssh-keygen”中找到它;而且使用“paramiko”模块,编写一个通过 ssh-agent 签名的自定义 Python 工具也相当容易。)
通常也不建议将相同的密钥用于不同的功能 - 尽管从技术上讲可以将相同的 RSA 密钥用于签名和加密,但密码学专家通常建议不要这样做,以防万一。