将 SSH 和 Git 连接到 gpg-agent

Naf*_*Kay 6 ssh gpg gpg-agent smartcard

我正在运行带有 OpenPGP 小程序的 YubiKey NEO 以将我的 GPG 密钥存储在智能卡上。我已经通过删除启动条目手动停止了所有其他 SSH 和 GPG 代理(在基本 OS 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;
Run Code Online (Sandbox Code Playgroud)

然后我开始了这个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;
Run Code Online (Sandbox Code Playgroud)

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

$ ssh user@myhost.net
Permission denied (publickey).
Run Code Online (Sandbox Code Playgroud)

奇怪的。

如果我尝试像这样运行该ssh过程gpg-agent,它就可以正常工作™:

$ gpg-agent --enable-ssh-support --daemon ssh user@myhost.net
Run Code Online (Sandbox Code Playgroud)

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

为了能够无缝地将我的智能卡用作 SSH 密钥,我缺少什么?有没有办法确保我不必在调用前ssh加上 with 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

Naf*_*Kay 3

事实证明,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
Run Code Online (Sandbox Code Playgroud)

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

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

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