Conectando o SSH e o Git ao gpg-agent

5

Estou executando um YubiKey NEO com o applet OpenPGP para armazenar minhas chaves GPG no cartão inteligente. Eu parei todos os outros agentes SSH e GPG manualmente removendo suas entradas de inicialização (no elementar OS Luna, Ubuntu 12.04).

Eu iniciei o processo scdaemon , certificando-me de que sua variável de ambiente é exportada:

$ 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;

Eu iniciei o processo gpg-agent , novamente certificando-me de que as variáveis de ambiente são exportadas:

$ 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;

Agora vou me conectar ao meu servidor SSH:

$ ssh [email protected]
Permission denied (publickey).

Estranho.

Se eu tentar executar o processo ssh a partir de gpg-agent , ele simplesmente funciona ™:

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

Ele solicita meu PIN usando pinentry , exatamente como esperado, e a conexão é bem-sucedida.

O que estou perdendo para poder usar meu cartão inteligente como uma chave SSH, sem problemas? Existe uma maneira de garantir que eu não precise prefixar chamadas para ssh com gpg-daemon ? Eu sei que eu poderia fazer um alias de Bash, mas eu não acho que isso realmente resolve o problema.

Atualizar

Descobri que parte do problema é que gpg-agent começa por si só sem --enable-ssh-support , o que parece ser uma parte do problema. Eu não vejo isso em aplicativos de inicialização dentro do Painel de controle do sistema, mas ele começa sozinho como meu usuário de login. Não está dentro de /etc/xdg/autostart . Onde posso encontrar isso e desativá-lo? Em meus aplicativos de inicialização, entretanto, acabei de executar:

killall -9 gpg-agent && gpg-agent --enable-ssh-support --daemon \
    --sh --write-env-file=$HOME/.gpg-agent-info

Eu, então, obtenho esse arquivo e exporto suas variáveis de ambiente e ele simplesmente funciona.

Meu ~/.gnupg/gpg-agent.conf já contém uma linha enable-ssh-support , mas parece não estar tendo efeito.

Como posso impedir que o outro processo gpg-agent inicie no login?

    
por Naftuli Kay 18.12.2014 / 00:39

1 resposta

3

Como se constata, o processo gpg-agent iniciado pelo X não carrega o arquivo de configuração correto e, portanto, não ativa o suporte SSH, o que quebra as coisas. Aqui está o arquivo conforme fornecido pelo pacote 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

Substitui este script por algo muito mais simples e eficaz:

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

Isso garantirá que o suporte SSH esteja sempre presente. Não sei por que gpg-agent não estava olhando para ~/.gnupg/gpg-agent.conf para ativar o suporte SSH, mas essa solução funciona, por isso estou feliz.

    
por 29.12.2014 / 23:17