如何在“openssl pkeyutl -decrypt”上使用“ssh-add”会话

如何在“openssl pkeyutl -decrypt”上使用“ssh-add”会话

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-addopenssl

答案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 密钥用于签名和加密,但密码学专家通常建议不要这样做,以防万一。

相关内容