Como forçar o GPG a usar pinentry no modo de console para solicitar senhas?

76

O uso de gpg em um ambiente baseado em console, como sessões ssh, falha porque o diálogo pinentry GTK não pode ser mostrado em uma sessão SSH.

Eu tentei, unset DISPLAYmas não ajudou. As opções de linha de comando do GPG não incluem uma opção para forçar o pinentry ao modo de console.

As versões mais antigas do GPG ofereciam um prompt baseado em texto que funcionava bem em sessões SSH, mas após a atualização, apenas falha.

Existe a --textmodeopção de linha de comando, mas, aparentemente, faz outra coisa.

Qual seria a maneira correta e limpa de obter entrada de pinos em texto sem formatação para sessões remotas?

ccpizza
fonte
DISPLAY="" gpg2 ...me ajudou, eu também instalados pinentry-maldições + pinentry-tty de antemão, não tenho certeza se eles são estritamente necessário
ThorSummoner

Respostas:

90

Para alterar a pinentry permanentemente, anexe o seguinte ao seu ~/.gnupg/gpg-agent.conf:

pinentry-program /usr/bin/pinentry-tty

(Nas versões mais antigas que não possuem pinentry-tty, use pinentry-curses para uma janela de diálogo 'terminal completo').

Diga ao agente GPG para recarregar a configuração:

gpg-connect-agent reloadagent /bye
gravidade
fonte
9
Não é completamente "são". Normalmente, gpg-agentem si deve detectar a presença ou ausência de $DISPLAYe escolher o pinentry apropriate ...
grawity
6
O agente provavelmente é capaz de detectar a presença de um xorg em execução. Mas ter um DISPLAYdefinido não significa necessariamente que eu possa ou queira usá-lo, por exemplo, quando conectado por SSH.
Ccpizza
4
@lfxgroove: o problema é que sunão altera a propriedade do seu TTY, então você precisa manualmente chown. Veja este artigo .
Rufflewind
2
@ Starx: Você cria um.
grawity
3
Outra dica: para visualizar todas as opções disponíveis, digite ls /usr/bin | grep pinentry. Vejo pinentry, pinentry-curses, pinentry-emacs, pinentry-gnome3, pinentry-gtk2, pinentry-qte pinentry-tty. Dessa forma, você pode escolher o que melhor combina com você, se você não tiver $DISPLAYproblemas.
precisa saber é o seguinte
8

Eu apenas tive esse problema no Ubuntu 16.04.3 ao tentar gerar / instalar uma chave privada usando o gpg2 (2.1.11) em uma conta do sistema sem senha e em uma conta de usuário pelo ssh. Nada funcionou dando:

gpg: chave FE17AE6D / FE17AE6D: erro ao enviar ao agente: permissão negada
gpg: erro ao criar matriz de skey: permissão negada

Eu então encontrei isso que funcionou para mim, então, resumidamente:

pico ~/.gnupg/gpg-agent.conf
# add: allow-loopback-pinentry
gpg-connect-agent reloadagent /bye
gpg2 --pinentry-mode loopback --import private.key
racitup
fonte
5

Em uma caixa debian:

sudo apt install pinentry-tty
sudo update-alternatives --config pinentry

(e defina-o como pinentry-tty)

John Lawrence Aspden
fonte
4

No Ubuntu 18.04, com a instalação padrão do gpg 2.2.4, tenho

/usr/bin/pinentry
/usr/bin/pinentry-gnome3
/usr/bin/pinentry-gtk-2
/usr/bin/pinentry-x11

Consegui fazer o seguinte para ter uma entrada de PIN baseada em texto:

export GPG_TTY=$(tty)
gpg-connect-agent updatestartuptty /bye >/dev/null
Roc White
fonte
3

Se você não o possui, instale pinentry-cursescom o yum ou o apt-get.

Então corra:

sudo update-alternatives --config pinentry

E selecione pinentry-maldições na lista.

Aiden Woodruff
fonte
2

Vou copiar minha resposta daqui ...

Olhando man pinentry-gnome3, vejo o seguinte:

   pinentry-gnome3  implements  a PIN entry dialog based on GNOME 3, which
   aims to follow the GNOME Human Interface Guidelines as closely as  pos‐
   sible.   If the X Window System is not active then an alternative text-
   mode dialog will be used.  There are other flavors that  implement  PIN
   entry dialogs using other tool kits.

Infelizmente, esse fallback em modo de texto não funciona para mim. Parece que outros têm o mesmo problema . No entanto, este comentário estimulou minha para tentar um programa de pin-entrada GUI diferente: pinentry-gtk2. Você pode mudar assim:

> sudo update-alternatives --config pinentry
There are 3 choices for the alternative pinentry (providing /usr/bin/pinentry).

  Selection    Path                      Priority   Status
------------------------------------------------------------
* 0            /usr/bin/pinentry-gnome3   90        auto mode
  1            /usr/bin/pinentry-curses   50        manual mode
  2            /usr/bin/pinentry-gnome3   90        manual mode
  3            /usr/bin/pinentry-gtk-2    85        manual mode

Press <enter> to keep the current choice[*], or type selection number: 3
update-alternatives: using /usr/bin/pinentry-gtk-2 to provide /usr/bin/pinentry (pinentry) in manual mode

Depois que mudei, funcionou perfeitamente para mim! Em um terminal na área de trabalho, ele usará a entrada de senha da GUI, mas quando eu ssh na minha máquina, ele usará uma entrada de senha em modo de texto.

mblythe
fonte
1

Para evitar o pop-up pinentry, você poderia ssh localhost. Forçando opcionalmente o X11 desativado, -x Disables X11 forwarding.veja o exemplo completo abaixo.

patrick@patrick-C504:~$ ssh localhost
patrick@localhost's password: 
Welcome to Ubuntu 14.04.3 LTS (GNU/Linux 3.13.0-68-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

Last login: Mon Nov 16 22:48:53 2015 from localhost
patrick@patrick-C504:~$ gpg --gen-key
gpg (GnuPG) 1.4.16; Copyright (C) 2013 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection? 4
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 
Requested keysize is 2048 bits
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 
Key does not expire at all
Is this correct? (y/N) y

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
    "Heinrich Heine (Der Dichter) <[email protected]>"

Real name: Foo
Name must be at least 5 characters long
Real name: FooBar
Email address: [email protected]
Comment: 
You selected this USER-ID:
    "FooBar <[email protected]>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o
You need a Passphrase to protect your secret key.

gpg: gpg-agent is not available in this session
Enter passphrase:
PvdL
fonte
3
Quais recursos do X11 especificamente devem ser desativados? Eu, pessoalmente, sei a resposta para minha pergunta, o autor não, então a resposta parece incompleta sem essa informação.
Ramhound #
ssh'ing para o host local foi suficiente para mim, mas opcionalmente -x Disables X11 forwarding.deve impedir qualquer encaminhamento do X11. A resposta é atualizada.
PVIL
Prefiro essa solução, já que o pinentry sobre -X não aparece - normalmente estou fisicamente no meu laptop, onde quero pinentry X (então não quero editar um arquivo conf o tempo todo), mas se Por acaso eu ssh -X nele, eu ainda posso querer um pinentry de maldições. É claro que, idealmente, o pinentry gtk seria realmente trabalhar sobre ssh -X: - /
unhammer
1

Achei o "exemplo completo" na resposta do PvdL um pouco confuso, eis o que faço:

ssh -X machine
# work hack hack work until I need something from gpg
ssh -x localhost -p$port
gpg2 --decrypt file.gpg
# enter password to pinentry
exit
# now the key is unlocked in gpg-agent, and I can keep decrypting files
# from my X ssh session without being asked for the password
desenfreado
fonte
0

Se você fizer isso export GPG_TTY=$(tty)e unset DISPLAYele lhe dará uma caixa de diálogo TLI pedindo a senha. Digitar a senha correta a decriptografa.

Se você NÃO fizer a exportação acima de GPG_TTY e desabilitar o DISPLAY, ele espera usar o X Windows. Se você iniciou sua sessão (como PuTTY) a partir de um sistema MS-Windows com o encaminhamento X11 ativado, deseja enviar a caixa de diálogo X-Window para o seu sistema MS Windows. Você pode usar um emulador de X, como Exceed ou Cygwin / X no Windows, para permitir que o prompt do X-Window apareça a senha na caixa do MS-Windows.

No entanto, você pode eliminar a necessidade de definir GPG_TTY e desabilitar o DISPLAY e obter o TLI ou a GUI executando a linha de comando com a --batchopção e inserindo a senha com a --passphraseopção:

gpg --batch --passphrase "<passphrase>" -o "<decrypted output file name>" --decrypt "<encrypted input file name>"

Todos os três métodos funcionaram para mim hoje no RHEL6 executando o gnupg2.

MensaWater
fonte
2
Segundo a resposta de Roc White , export GPG_TTY=$(tty)é suficiente. Você já tentou isso? Você tem uma referência que diz que tambémunset DISPLAY é necessário? PS As pessoas não gostam de colocar senhas na linha de comando.
Scott