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

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

私はGPGキーをスマートカードに保存するためにOpenPGPアプレットと一緒にYubiKey NEOを実行しています。スタートアップエントリを削除して、他のすべての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).

奇妙な。

次のsshプロセスを実行しようとするとgpg-agent機能します™:

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

期待どおりに PIN を入力するよう求められ、pinentry接続に成功しました。

私のスマートカードを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ログイン時に他のプロセスが起動しないようにするには?

答え1

gpg-agentプロセスが開始されたことがわかりました。 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サポートが常に提供されます。なぜSSHサポートの有効化をgpg-agent検討していないのかわかりませんが、~/.gnupg/gpg-agent.confこの解決策がうまくいくのでうれしいです。

関連情報