我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
?
您将其转换为 PEM 或 PKCS#8 格式。它始终是 RSA 密钥,只是封装发生了变化。
不,没有。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”模块编写一个自定义 Python 工具通过 ssh-agent 进行签名非常容易。)
通常也不建议对不同的功能使用相同的密钥 - 尽管在技术上可以将相同的 RSA 密钥用于签名和加密,但作为预防措施,密码学专家通常建议不要这样做。