gpg-agent 拒绝 SSH 密钥,ssh-add 报告“代理拒绝操作”

use*_*445 15 openssh ssh-agent gpg-agent

我在 arch linux 上使用 openssh7.5p1 和 gnupg 2.1.21(这些是 arch 附带的默认版本)。我想gpg-agent用作 ssh 代理。我把以下内容放在我的~/.gnupg/gpg-agent.conf

pinentry-program /usr/bin/pinentry-qt
enable-ssh-support
Run Code Online (Sandbox Code Playgroud)

Arch 自动从 systemd 启动一个 gpg-agent,所以我设置

export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/gnupg/S.gpg-agent.ssh"
Run Code Online (Sandbox Code Playgroud)

当我运行时ssh-add -l,它不报告任何身份并ps报告gpg-agent --supervised我所期望的过程。

不幸的是,当我运行时ssh-add,无论是什么键类型,它都不起作用。这是我如何尝试 dsa 的示例:

$ ssh-keygen -f testkey -t dsa -N ''
Generating public/private dsa key pair.
Your identification has been saved in testkey.
Your public key has been saved in testkey.pub.
$ ssh-add testkey
Could not add identity "testkey": agent refused operation
Run Code Online (Sandbox Code Playgroud)

所有其他 gpg 功能正常工作(加密/解密/签名)。此外,如果我直接将它们与 ssh 一起使用,我生成的密钥可以正常工作,如果我运行ssh-agentopenssh 附带的密钥,它们可以正常工作。

文档说ssh-add应该将密钥添加到~/.gnupg/sshcontrol,但显然没有发生任何事情。

我的问题:什么是可以载入的OpenSSH的生成的密钥最简单的方式ssh-keygen进入gpg-agent,并且有人可以剪切和粘贴出这是如何工作的一个终端会话?

use*_*445 40

答案显然是运行:

echo UPDATESTARTUPTTY | gpg-connect-agent
Run Code Online (Sandbox Code Playgroud)

我不知道为什么 pinentry 程序可以很好地用于其他用途,例如解密文件,但不适用于ssh-add.

虽然这现在有效,但它也会复制一份未显示在 下的 ssh 私钥gpg -Kv,而且似乎不允许您更改私钥上的密码(因为您无法使用 编辑它--edit-key) . 基本上,我对这种方式gpg-agent对您的秘密被复制的位置的可见性很低感到非常不满意。如果您问这个问题是因为您希望gpg-agent可能是 更好的替代方案ssh-agent,那么我鼓励您坚持ssh-agent而不是尝试我的答案。首选的主要原因gpg-agent是您是否需要使用智能卡。