¿Cómo forzar a GPG a usar pinentry en modo consola para solicitar contraseñas?

76

El uso de gpg desde un entorno basado en la consola, como las sesiones ssh, falla porque el diálogo de pinentry GTK no se puede mostrar en una sesión SSH.

Lo intenté unset DISPLAYpero no sirvió de nada. Las opciones de línea de comando GPG no incluyen un interruptor para forzar la entrada al modo consola.

Las versiones anteriores de GPG ofrecían un mensaje basado en texto que funcionaba bien en las sesiones SSH, pero después de la actualización simplemente falla.

Existe el --textmodecambio de línea de comando pero aparentemente, hace algo más.

¿Cuál sería la forma correcta y limpia de obtener una entrada de pin de texto sin formato para sesiones remotas?

ccpizza
fuente
DISPLAY="" gpg2 ...me ayudó, también instalé pinentry-curses + pinentry-tty de antemano, no estoy seguro de si son estrictamente necesarios
ThorSummoner

Respuestas:

90

Para cambiar la pinentry permanentemente, agregue lo siguiente a su ~/.gnupg/gpg-agent.conf:

pinentry-program /usr/bin/pinentry-tty

(En versiones anteriores que carecen de pinentry-tty, use pinentry-curses para una ventana de diálogo de 'terminal completo').

Dígale al agente GPG que vuelva a cargar la configuración:

gpg-connect-agent reloadagent /bye
Gravedad
fuente
99
No es completamente "cuerdo". Normalmente, gpg-agentdebería misma detectar la presencia o ausencia de $DISPLAYy elige el pinentry apropriate ...
grawity
66
Es muy probable que el agente sea capaz de detectar la presencia de un xorg en ejecución. Pero tener un DISPLAYdefinido no necesariamente significa que puedo o quiero usarlo, por ejemplo, cuando estoy conectado a través de SSH.
ccpizza
44
@lfxgroove: el problema es que suno cambia la propiedad de su TTY, por lo que debe hacerlo manualmente chown. Ver este artículo .
Rufflewind
2
@Starx: Usted crea uno.
Grawity
3
Otro consejo: para ver todas las opciones disponibles, escriba ls /usr/bin | grep pinentry. Veo pinentry, pinentry-curses, pinentry-emacs, pinentry-gnome3, pinentry-gtk2, pinentry-qty pinentry-tty. De esta manera, puede elegir el que más le convenga, si no tiene $DISPLAYproblemas.
Jeffrey Lebowski
8

Acabo de tener este problema en Ubuntu 16.04.3 al intentar generar / instalar una clave privada usando gpg2 (2.1.11) en una cuenta del sistema sin contraseña, y en una cuenta de usuario a través de ssh. Nada funcionó dando:

gpg: clave FE17AE6D / FE17AE6D: error al enviar al agente: permiso denegado
gpg: error al construir la matriz skey: permiso denegado

Entonces encontré esto que funcionó para mí, así que en resumen:

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

En una caja de Debian:

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

(y configúrelo en pinentry-tty)

John Lawrence Aspden
fuente
4

En Ubuntu 18.04, con la instalación predeterminada de gpg 2.2.4, tengo

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

Pude hacer lo siguiente para tener una entrada de PIN basada en texto:

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

Si no lo tiene, instálelo pinentry-cursescon yum o apt-get.

Entonces corre:

sudo update-alternatives --config pinentry

Y seleccione pinentry-curses de la lista.

Aiden Woodruff
fuente
2

Copiaré mi respuesta desde aquí ...

Mirando man pinentry-gnome3, veo esto:

   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.

Desafortunadamente, este respaldo en modo texto no funciona para mí. Parece que otros tienen el mismo problema . Sin embargo, este comentario estimuló mi probar un programa de pines de entrada de interfaz gráfica de usuario diferente: pinentry-gtk2. Puedes cambiar así:

> 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

Una vez que cambié, ¡funcionó perfectamente para mí! En una terminal en el escritorio, usará la entrada de contraseña de la GUI, pero cuando ingrese a mi máquina, usará una entrada de contraseña en modo texto.

mblythe
fuente
1

Para evitar la ventana emergente de pinentry que podrías ssh localhost. Opcionalmente forzando X11 deshabilitado, -x Disables X11 forwarding.vea el ejemplo completo a continuación.

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
fuente
3
¿Qué características de X11 deben deshabilitarse específicamente? Yo personalmente conozco la respuesta a mi pregunta, el autor no, así que la respuesta parece incompleta sin esta información.
Ramhound
Enviarme al host local fue suficiente para mí, pero opcionalmente -x Disables X11 forwarding.debería evitar cualquier reenvío X11. La respuesta está actualizada.
PvdL
Prefiero esta solución, dado que pinentry over -X no aparece: normalmente estoy físicamente en mi computadora portátil, donde quiero pinentry X (por lo que no quiero editar un archivo conf todo el tiempo), pero si Resulta que ssh -X en él todavía podría querer un pinentry maldiciones. Por supuesto, lo ideal es que la ubicación de gtk realmente funcione sobre ssh -X: - /
unhammer
1

Encontré el "ejemplo completo" en la respuesta de PvdL un poco confuso, esto es lo que hago:

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
desarmar
fuente
0

Si lo hace export GPG_TTY=$(tty)y unset DISPLAYse le dará un cuadro de diálogo TLI pidiendo la frase de contraseña. Escribir la frase de contraseña correcta hace que se descifre.

Si NO realiza la exportación anterior de GPG_TTY y desarma DISPLAY, espera usar X Windows. Si inició su sesión (como PuTTY) desde un sistema MS-Windows con el reenvío X11 activado, quiere enviar el cuadro de diálogo X-Window a su sistema MS Windows. Puede usar un emulador X como Exceed o Cygwin / X en Windows para permitir que aparezca el mensaje de X-Window para la frase de contraseña en su cuadro de MS-Windows.

Sin embargo, puede eliminar la necesidad de configurar GPG_TTY y deshabilitar DISPLAY y obtener el TLI o la GUI ejecutando la línea de comando con --batchopción y colocando la frase de contraseña con la --passphraseopción:

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

Los 3 métodos me funcionaron hoy en RHEL6 con gnupg2.

MensaWater
fuente
2
Según la respuesta de Roc White , export GPG_TTY=$(tty)es suficiente. ¿Has intentado eso? ¿Tiene una referencia que dice que tambiénunset DISPLAY es necesario? PD A la gente no le gusta poner frases de contraseña en la línea de comando.
Scott