如何转换我的加密 PGP 密钥以用于执行 SSH 身份验证?

信息安全 密钥管理 SSH pgp
2021-08-24 15:50:39

我希望隐藏我的 PGP 密钥 (RSA) 以用于执行 SSH 身份验证。经过一番搜索,我发现openpgp2ssh,这似乎是一个合适的工具。一切都适用于我的 pubkey:

$ gpg --export "$key" | openpgp2ssh "$key"
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC51Cw3ZxO5TSncaDLzQ89SSZAF7Z9cFR5mv4uhmGw3tDfiaAjNFVjp90YNYi2teveb5EjncIK5RMYQefKpvvsawQZ4KJKbrDFrrQbMmIG67A1qopKxn5rF8QsjzYvrlGSi9pnjfZVN+VfTaspomVpwCpe9oxd8ZlKdViABgBV8p0hL6I4Gqm+I37az9apO4wCvlN8XJMia3J1JxIShyLYGfa2ued5rRFYiCEV3/smtrjycEZ8OYLTLhC/vydhXCSYrCxWHxhv213Uho641cttaL2SlPGDX9Uuq3JfjCoC0Y6EN7/+GV2u9R48/QJpUaOjEhLRm8F/LFRuHDFYJmyNgv11DsRAMvh7psGY2196bBYSdrzfZxxCQDdJrNxNzQvIG33JavMXOiBAbAYxaq7DWWlVPcE3fy+VxYPH+XicqxD58qdWapspJhRxEKzQa7IfUULGQHVg31NYWGsN4dkva2XjV35SZf6M3nrfjz4XitiwH0SOxbXBRKUdZhwCnr+5GcsWkax7Ph6QGvWVP6mgpUDBuMQ+znkUVr8tDkmrm5M6PC6x8SOA0ecdjNKB2NK23A6w4V7lsfMvDl4uBMzxRzXOXLIUXunsZ7MQTV5ymtZvk3oYccnXNxtVZGF2Cu9Wfy+6c+XL+z4Zfc6XvPSgtBDOApV3owL86OOoLO5X3HQ==

但是,当我尝试转换我的私钥以供使用时,它会显示以下错误:

$ gpg --export-secret-key "$key" | openpgp2ssh "$key"
We cannot handle encrypted secret keys.  Skipping!

我的密钥确实是加密的。理想情况下,我希望有一种方法可以将我的 PGP 密钥转换为标准 SSH 程序可以理解的数据,而不是依赖非标准插件。这可能吗?

3个回答

如果没有人也可以转换私钥,那么转换公钥是没有意义的,这意味着这个程序是在考虑这种转换过程的情况下创建的。您会注意到错误消息显示“我们无法处理加密的密钥”。

passwd因此,我建议您使用 in 中的命令删除私钥的密码gpg --edit-key您显然应该在转换后重新加密旧的 gpg 私钥和新的 ssh 私钥。

如果您担心驱动器上残留未加密的密钥,请使用 encfs、truecrypt 等创建加密分区,或者创建ramdisk你应该保持 ramdisk 小而短,以防止内核交换它,除非你找到调用 mlock 的技巧。任何加密文件系统都应该已经锁定了它们的数据页。

我是 openpgp2ssh 的上游作者之一。对困惑感到抱歉。你会注意到 openpgp2ssh(1) 手册页有一个“BUGS”部分,上面写着:

 openpgp2ssh currently cannot handle passphrase-protected secret keys on
 input.

如果您可以提出更清晰的单行错误消息或对手册页的改进,以便您可以更轻松地在文档中找到答案,我们很乐意改进该工具。给我们留言:monkeysphere@lists.riseup.net。我认为目前没有任何开发人员密切关注 stackexchange,因此邮件列表是一种更好的联系方式。

Jeff Burdges 的出色回答向我展示了最终的方法。以下是我采取的确切步骤:

key=2A7D4D74

# Back up the original key so you can reimport it afterwards
gpg --export-secret-key "$key" > id_rsa.bak

# Now remove the encryption using the method listed in Jeff Burdges' answer:
# * gpg --edit-key "$key"
# * Issue passwd and remove the password
# * Quit, and save changes

# We convert the keys
gpg --export "$key" | openpgp2ssh "$key" > ~/.ssh/id_rsa.pub
gpg --export-secret-key "$key" | openpgp2ssh "$key" > ~/.ssh/id_rsa

# Then, we change the password for the SSH secret key
ssh-keygen -f ~/.ssh/id_rsa -p

# Now reimport the original key (deletion is required or for some reason it fails to reimport as encrypted)
gpg --delete-secret-key "$key"
gpg --import < id_rsa.bak
rm id_rsa.bak