将 SSH 和 Git 连接到 gpg-agent

将 SSH 和 Git 连接到 gpg-agent

我正在运行带有 OpenPGP 小程序的 YubiKey NEO,以将我的 GPG 密钥存储在智能卡上。我已通过删除启动条目手动停止所有其他 SSH 和 GPG 代理(在基本操作系统 Luna、Ubuntu 12.04 上)。

然后我开始该scdaemon过程,确保导出其环境变量:

$ scdaemon --daemon
SCDAEMON_INFO=/tmp/gpg-zKwfGU/S.scdaemon:13142:1; export SCDAEMON_INFO;
$ SCDAEMON_INFO=/tmp/gpg-zKwfGU/S.scdaemon:13142:1; export SCDAEMON_INFO;

然后我开始该gpg-agent过程,再次确保导出环境变量:

$ gpg-agent --enable-ssh-support --daemon --write-env-file "${HOME}/.gpg-agent-info" 
GPG_AGENT_INFO=/tmp/gpg-9UaXHX/S.gpg-agent:13322:1; export GPG_AGENT_INFO;
SSH_AUTH_SOCK=/tmp/gpg-WAYxYZ/S.gpg-agent.ssh; export SSH_AUTH_SOCK;
SSH_AGENT_PID=13322; export SSH_AGENT_PID;
$ GPG_AGENT_INFO=/tmp/gpg-9UaXHX/S.gpg-agent:13322:1; export GPG_AGENT_INFO;
$ SSH_AUTH_SOCK=/tmp/gpg-WAYxYZ/S.gpg-agent.ssh; export SSH_AUTH_SOCK;
$ SSH_AGENT_PID=13322; export SSH_AGENT_PID;

我现在连接到我的 SSH 服务器:

$ ssh [email protected]
Permission denied (publickey).

诡异的。

如果我尝试像这样运行该ssh进程gpg-agent,它就会起作用™:

$ gpg-agent --enable-ssh-support --daemon ssh [email protected]

正如预期的那样,它提示我使用 PIN 码pinentry,并且连接成功。

为了能够无缝地使用我的智能卡作为 SSH 密钥,我缺少什么?有没有办法确保我不必在调用前加上sshwith前缀gpg-daemon?我知道我可以创建一个 Bash 别名,但我认为这并不能真正解决问题。


更新

我发现问题的一部分是gpg-agent在没有 的情况下自行开始的--enable-ssh-support,这似乎是问题的一部分。我在系统控制面板内的启动应用程序中没有看到它,但它作为我的登录用户自行启动。它不在 的内部/etc/xdg/autostart。我在哪里可以找到它并禁用它?与此同时,在我的启动应用程序中,我只是运行:

killall -9 gpg-agent && gpg-agent --enable-ssh-support --daemon \
    --sh --write-env-file=$HOME/.gpg-agent-info

然后我获取该文件并导出其环境变量,它就可以工作了。

我的~/.gnupg/gpg-agent.conf已经包含一行enable-ssh-support,但它似乎没有效果。

如何阻止其他gpg-agent进程在登录时启动?

答案1

事实证明,gpg-agentX 启动的进程没有加载正确的配置文件,因此没有启用 SSH 支持,这会破坏事情。这是 DEB 包提供的文件gpg-agent

/etc/X11/Xsession.d/90gpg-agent:

: ${GNUPGHOME=$HOME/.gnupg}

GPGAGENT=/usr/bin/gpg-agent
PID_FILE="$GNUPGHOME/gpg-agent-info-$(hostname)"

if grep -;s '^[[:space:]]*use-agent' "$GNUPGHOME/gpg.conf" "$GNUPGHOME/options" &&
    test -x $GPGAGENT &&
    { test -z "$GPG_AGENT_INFO" || ! $GPGAGENT 2>/dev/null ; }; then

    if [ -r "$PID_FILE" ]; then
        . "$PID_FILE"
    fi

    # Invoking gpg-agent with no arguments exits successfully if the agent
    # is already running as pointed by $GPG_AGENT_INFO
    if ! $GPGAGENT 2>/dev/null; then
        STARTUP="$GPGAGENT --daemon --sh --write-env-file=$PID_FILE $STARTUP"
    fi
fi

我用更简单有效的东西替换了这个脚本:

if [ ! -z "$(pgrep gpg-agent)" ]; then
    $GPGAGENT --daemon --enable-ssh-support --sh --write-env-file=$PID_FILE
fi

这将确保 SSH 支持始终存在。我不确定为什么gpg-agent不考虑~/.gnupg/gpg-agent.conf启用 SSH 支持,但这个解决方案有效,所以我很高兴。

相关内容