我正在运行带有 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 密钥,我缺少什么?有没有办法确保我不必在调用前加上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
然后我获取该文件并导出其环境变量,它就可以工作了。
我的~/.gnupg/gpg-agent.conf
已经包含一行enable-ssh-support
,但它似乎没有效果。
如何阻止其他gpg-agent
进程在登录时启动?
答案1
事实证明,gpg-agent
X 启动的进程没有加载正确的配置文件,因此没有启用 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 支持,但这个解决方案有效,所以我很高兴。