Jak zmusić GPG do używania pinentry w trybie konsoli do monitowania o hasła?


75

Używanie gpg ze środowiska opartego na konsoli, takiego jak sesje ssh, kończy się niepowodzeniem, ponieważ okno dialogowe pinentry GTK nie może zostać wyświetlone w sesji SSH.

Próbowałem, unset DISPLAYale to nie pomogło. Opcje wiersza poleceń GPG nie zawierają przełącznika do wymuszania pinentry do trybu konsoli.

Starsze wersje GPG oferowały tekstowy monit, który działał dobrze w sesjach SSH, ale po aktualizacji po prostu się nie udaje.

Jest --textmodeprzełącznik linii poleceń, ale najwyraźniej robi coś innego.

Jaki byłby właściwy i czysty sposób uzyskania zwykłego wpisu PIN dla sesji zdalnych?


DISPLAY="" gpg2 ...pomógł mi, wcześniej zainstalowałem też przekleństwa pinentry + pintyry-tty, nie jestem pewien, czy są one absolutnie konieczne
ThorSummoner

Odpowiedzi:


89

Aby trwale zmienić pinentry, dołącz następujące elementy do ~/.gnupg/gpg-agent.conf:

pinentry-program /usr/bin/pinentry-tty

(W starszych wersjach, które nie posiadają pinty-tty, użyj przekleństw pinentry w oknie dialogowym „pełnego terminala”).

Poinformuj agenta GPG o ponownym załadowaniu konfiguracji:

gpg-connect-agent reloadagent /bye

9
To nie jest całkowicie „rozsądne”. Zwykle gpg-agentpowinien sam wykryć obecność lub brak $DISPLAYi wybrać odpowiednią pinentry ...
grawity

6
Agent najprawdopodobniej jest w stanie wykryć obecność działającego xorga. Ale DISPLAYzdefiniowanie nie musi oznaczać, że mogę lub chcę z niego korzystać, na przykład w przypadku połączenia przez SSH.
ccpizza,

4
@lfxgroove: problem polega na tym, suże nie zmienia to własności twojego TTY, więc musisz to zrobić ręcznie chown. Zobacz ten artykuł .
Rufflewind

2
@Starx: Ty je tworzysz.
grawitacja

3
Kolejna wskazówka: aby wyświetlić wszystkie dostępne opcje, wpisz ls /usr/bin | grep pinentry. Widzę pinentry, pinentry-curses, pinentry-emacs, pinentry-gnome3, pinentry-gtk2, pinentry-qti pinentry-tty. W ten sposób możesz wybrać ten, który najbardziej Ci odpowiada, jeśli nie masz $DISPLAYproblemu.
Jeffrey Lebowski,

8

Właśnie miałem ten problem na Ubuntu 16.04.3, gdy próbowałem wygenerować / zainstalować klucz prywatny za pomocą gpg2 (2.1.11) na koncie systemowym bez hasła i na koncie użytkownika przez ssh. Nic nie działało, dając:

gpg: klucz FE17AE6D / FE17AE6D: błąd wysyłania do agenta: Odmowa uprawnień
gpg: błąd przy budowaniu tablicy skey: Odmowa uprawnień

Potem znalazłem to, co działało dla mnie, więc w skrócie:

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


4

Na Ubuntu 18.04, z domyślną instalacją gpg 2.2.4, mam

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

Udało mi się wykonać następujące czynności, aby wprowadzić tekstowy kod PIN:

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

3

Jeśli go nie masz, zainstaluj pinentry-cursesz yum lub apt-get.

Następnie uruchomić:

sudo update-alternatives --config pinentry

I wybierz z listy przekleństwa pinentry.


2

Skopiuję stąd swoją odpowiedź ...

Patrząc na to man pinentry-gnome3, widzę to:

   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.

Niestety ten tryb zastępczy w trybie tekstowym nie działa dla mnie. Wygląda na to, że inni mają ten sam problem . Jednak ten komentarz zachęciły Moje strony aby spróbować innego GUI programu pin wjazdu: pinentry-gtk2. Możesz zmienić w następujący sposób:

> 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

Po przełączeniu działało to dla mnie idealnie! W terminalu na pulpicie użyje hasła GUI, ale kiedy ssh do mojego komputera, użyje hasła w trybie tekstowym.


1

Aby zapobiec wyskakującym okienku pinentry, możesz ssh localhost. Opcjonalnie wymuszenie wyłączenia X11, -x Disables X11 forwarding.Zobacz pełny przykład poniżej.

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
Które funkcje X11 powinny zostać wyłączone? Osobiście znam odpowiedź na moje pytanie, autor nie, więc odpowiedź wydaje się niepełna bez tych informacji.
Ramhound,

ssh'ing do lokalnego hosta był dla mnie wystarczający, ale opcjonalnie -x Disables X11 forwarding.powinien uniemożliwić jakiekolwiek przekazywanie X11. Odpowiedź została zaktualizowana.
PvdL,

Wolę to rozwiązanie, biorąc pod uwagę, że pinentry ponad -X nie pojawia się - zwykle fizycznie siedzę przy laptopie, gdzie chcę pinentry X (więc nie chcę przez cały czas edytować pliku conf), ale jeśli Zdarza mi się, że ssh -X w to może nadal chcę mieć przekleństwa. Oczywiście idealnie, pinentry gtk faktycznie działałyby nad ssh -X: - /
unhammer

1

Uważam, że „pełny przykład” w odpowiedzi PvdL jest nieco mylący, oto co robię:

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

Jeśli tak export GPG_TTY=$(tty)i unset DISPLAYto daje się okno dialogowe z prośbą o TLI hasłem. Wpisanie poprawnego hasła powoduje jego odszyfrowanie.

Jeśli NIE wykonasz powyższego eksportu GPG_TTY i nie wyłączysz DISPLAY, spodziewa się, że użyje X Windows. Jeśli sesja została uruchomiona (na przykład PuTTY) z systemu MS-Windows z włączonym przekazywaniem X11, chce wysłać okno dialogowe X-Window do systemu MS Windows. Możesz użyć emulatora X, takiego jak Exceed lub Cygwin / X w systemie Windows, aby zezwolić X-Window na pojawienie się hasła w oknie MS-Windows.

Można jednak wyeliminować potrzebę ustawiania GPG_TTY i rozbrojenia WYŚWIETLACZA oraz uzyskania TLI lub GUI, uruchamiając wiersz poleceń z --batchopcją i wstawiając hasło z --passphraseopcją:

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

Wszystkie 3 metody działały dzisiaj dla mnie na RHEL6 z uruchomionym gnupg2.


2
Zgodnie z odpowiedzią Roc White'a , export GPG_TTY=$(tty)jest wystarczająca. Próbowałeś tego? Czy masz referencje, które mówią, że unset DISPLAYjest to również konieczne? PS Ludzie nie lubią umieszczać haseł w wierszu poleceń.
Scott
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.