Come forzare GPG a utilizzare la pinentry in modalità console per richiedere password?


76

L'uso di gpg da un ambiente basato su console come sessioni ssh non riesce perché la finestra di dialogo Pinentry GTK non può essere mostrata in una sessione SSH.

Ho provato unset DISPLAYma non ha aiutato. Le opzioni della riga di comando GPG non includono un interruttore per forzare il pinentry in modalità console.

Le versioni precedenti di GPG offrivano un prompt basato su testo che funzionava bene nelle sessioni SSH ma dopo l'aggiornamento non ha funzionato.

C'è l' --textmodeopzione della riga di comando ma a quanto pare, fa qualcos'altro.

Quale sarebbe il modo corretto e pulito di ottenere l'inserimento di pin in testo normale per le sessioni remote?


DISPLAY="" gpg2 ...mi ha aiutato, ho anche installato pinentry-curses + pinentry-tty in anticipo, non sono sicuro che siano strettamente necessari
ThorSummoner,

Risposte:


90

Per modificare permanentemente il pinentry, aggiungi quanto segue a ~/.gnupg/gpg-agent.conf:

pinentry-program /usr/bin/pinentry-tty

(Nelle versioni precedenti che non dispongono di pinentry-tty, utilizzare pinentry-curses per una finestra di dialogo "full-terminal".)

Di 'all'agente GPG di ricaricare la configurazione:

gpg-connect-agent reloadagent /bye

9
Non è completamente "sano". Normalmente, gpg-agentdovrebbe rilevare la presenza o la mancanza di $DISPLAYe scegliere l'appropriata pinentry ...
Grawity

6
Molto probabilmente l'agente è in grado di rilevare la presenza di un xorg in esecuzione. Ma avere un DISPLAYdefinito non significa necessariamente che posso o voglio usarlo, ad esempio, quando connesso su SSH.
ccpizza,

4
@lfxgroove: il problema è che sunon cambia la proprietà del TTY, quindi è necessario manualmente chown. Vedere questo articolo .
Rufflewind,

2
@Starx: ne crei uno.
Grawity

3
Un altro consiglio: per visualizzare tutte le opzioni disponibili, digitare ls /usr/bin | grep pinentry. Vedo pinentry, pinentry-curses, pinentry-emacs, pinentry-gnome3, pinentry-gtk2, pinentry-qte pinentry-tty. In questo modo puoi scegliere quello più adatto a te, se non hai $DISPLAYproblemi.
Jeffrey Lebowski il

8

Ho appena avuto questo problema su Ubuntu 16.04.3 quando ho provato a generare / installare una chiave privata usando gpg2 (2.1.11) su un account di sistema senza password e su un account utente su ssh. Niente ha funzionato dando:

gpg: chiave FE17AE6D / FE17AE6D: errore durante l'invio all'agente: autorizzazione negata
gpg: errore nella creazione di array skey: autorizzazione negata

Ho quindi trovato questo che ha funzionato per me, quindi in breve:

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

5

Su una casella debian:

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

(e impostalo su pinentry-tty)


4

Su Ubuntu 18.04, con l'installazione predefinita di gpg 2.2.4, ho

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

Sono stato in grado di fare quanto segue per avere una voce PIN basata su testo:

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

3

Se non lo hai, installa pinentry-cursescon yum o apt-get.

Quindi, esegui:

sudo update-alternatives --config pinentry

E seleziona maledizioni pinentry dall'elenco.


2

Copierò la mia risposta da qui ...

Guardando man pinentry-gnome3, vedo questo:

   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.

Sfortunatamente, questo fallback in modalità testo non funziona per me. Sembra che altri abbiano lo stesso problema . Tuttavia, questo commento ha stimolato la mia a provare un diverso programma di pin-entry GUI: pinentry-gtk2. Puoi passare in questo modo:

> 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 volta che ho cambiato, ha funzionato perfettamente per me! In un terminale sul desktop, utilizzerà la voce della password della GUI, ma quando accedo al mio computer, utilizzerà una voce della password in modalità testo.


1

Per evitare il popup pinentry potresti ssh localhost. Opzionalmente forzando X11 disabilitato, -x Disables X11 forwarding.vedere l'esempio completo di seguito.

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) <heinrichh@duesseldorf.de>"

Real name: Foo
Name must be at least 5 characters long
Real name: FooBar
Email address: foorbar@foo.bar
Comment: 
You selected this USER-ID:
    "FooBar <foorbar@foo.bar>"

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:

3
Quali funzioni X11 in particolare dovrebbero essere disabilitate? Conosco personalmente la risposta alla mia domanda, l'autore no, quindi la risposta sembra incompleta senza queste informazioni.
Ramhound,

mi è bastato inviare un messaggio all'host locale, ma opzionalmente -x Disables X11 forwarding.dovrebbe impedire qualsiasi inoltro X11. La risposta è aggiornata
PvdL

Preferisco questa soluzione, dato che il pinentry su -X non si presenta - normalmente sono fisicamente sul mio laptop, dove voglio il pinentry X (quindi non voglio modificare un file conf in ogni momento), ma se Mi capita di ssh -X in esso, potrei ancora voler una maledizione di maledizioni. Naturalmente, idealmente, il pinkt di gtk avrebbe effettivamente funzionato su ssh -X: - /
unhammer

1

Ho trovato un po 'confuso l' "esempio completo" nella risposta di PvdL, ecco cosa faccio:

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

0

Se lo fate export GPG_TTY=$(tty)e unset DISPLAYvi darà una finestra di dialogo che chiede TLI la passphrase. Digitando la passphrase corretta la si decodifica.

Se NON si esegue l'esportazione sopra di GPG_TTY e non si è impostati DISPLAY, si prevede di utilizzare X Windows. Se hai avviato la sessione (come PuTTY) da un sistema MS-Windows con l'inoltro X11 attivato, desidera inviare la finestra di dialogo X-Window al tuo sistema MS Windows. È possibile utilizzare un emulatore X come Exceed o Cygwin / X su Windows per consentire al prompt X-Window di visualizzare la passphrase sulla casella MS-Windows.

Tuttavia, è possibile eliminare la necessità di impostare GPG_TTY e deselezionare DISPLAY e ottenere TLI o GUI eseguendo la riga di comando con l' --batchopzione e inserendo la passphrase con l' --passphraseopzione:

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

Tutti e 3 i metodi hanno funzionato per me oggi su RHEL6 con gnupg2.


2
Secondo la risposta di Roc White , export GPG_TTY=$(tty)è sufficiente. Ci hai provato? Hai un riferimento che dice che unset DISPLAYè anche necessario? PS Alla gente non piace mettere passphrase sulla riga di comando.
Scott,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.