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.