web-dev-qa-db-ja.com

SSHとGitをgpg-agentに接続する

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プロセスがログイン時に開始しないようにするにはどうすればよいですか?

6
Naftuli Kay

結局のところ、Xによって開始されたgpg-agentプロセスは正しい構成ファイルをロードしないため、SSHサポートが有効にならず、問題が発生します。 gpg-agentDEBパッケージによって提供されるファイルは次のとおりです。

/ 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を調べていなかった理由はわかりませんが、このソリューションは機能するので、満足しています。

3
Naftuli Kay