OpenPGPアプレットを使用してYubiKeyNEOを実行し、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;
次に、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).
奇妙な。
このようにgpg-agent
からssh
プロセスを実行しようとすると、正常に機能します™:
$ gpg-agent --enable-ssh-support --daemon ssh [email protected]
期待どおり、pinentry
を使用してPIN PIN $ ===を入力するように求められ、接続は成功します。
スマートカードをSSHキーとしてシームレスに使用できるようにするために、何が欠けていますか? ssh
への呼び出しの前に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
プロセスがログイン時に開始しないようにするにはどうすればよいですか?
結局のところ、Xによって開始されたgpg-agent
プロセスは正しい構成ファイルをロードしないため、SSHサポートが有効にならず、問題が発生します。 gpg-agent
DEBパッケージによって提供されるファイルは次のとおりです。
/ 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
がSSHサポートを有効にするために~/.gnupg/gpg-agent.conf
を調べていなかった理由はわかりませんが、このソリューションは機能するので、満足しています。