Wie erzwinge ich, dass GPG im Konsolenmodus nach Passwörtern fragt?

76

Die Verwendung von gpg in einer konsolenbasierten Umgebung wie z. B. ssh-Sitzungen schlägt fehl, da das Dialogfeld zur GTK-Eingabe in einer SSH-Sitzung nicht angezeigt werden kann.

Ich habe es versucht, unset DISPLAYaber es hat nicht geholfen. Die GPG-Befehlszeilenoptionen enthalten keinen Schalter, um die Eingabe in den Konsolenmodus zu zwingen.

Ältere GPG-Versionen boten eine textbasierte Eingabeaufforderung, die in SSH-Sitzungen einwandfrei funktionierte, nach dem Upgrade jedoch fehlschlug.

Es gibt die --textmodeBefehlszeilenoption, aber anscheinend macht sie etwas anderes.

Was wäre die richtige und saubere Methode, um eine Klartext-PIN-Eingabe für Remote-Sitzungen zu erhalten?

ccpizza
quelle
DISPLAY="" gpg2 ...hat mir geholfen, ich habe auch vorher pinentry-curses + pinentry-tty installiert, nicht sicher, ob sie unbedingt notwendig sind
ThorSummoner

Antworten:

90

Um die Eingabe dauerhaft zu ändern, fügen Sie Folgendes an Ihre hinzu ~/.gnupg/gpg-agent.conf:

pinentry-program /usr/bin/pinentry-tty

(Verwenden Sie in älteren Versionen, in denen es an Pinentry-Tty mangelt, Pinentry-Curses für ein 'Full-Terminal'-Dialogfeld.)

Weisen Sie den GPG-Agenten an, die Konfiguration neu zu laden:

gpg-connect-agent reloadagent /bye
Grawity
quelle
9
Es ist nicht ganz "gesund". Normalerweise gpg-agentsollte sich das Vorhandensein oder Fehlen von erkennen $DISPLAYund die entsprechende Pinentry wählen ...
Grawity
6
Der Agent ist höchstwahrscheinlich in der Lage, das Vorhandensein eines laufenden xorg zu erkennen. Ein DISPLAYDefined zu haben bedeutet aber nicht unbedingt, dass ich es verwenden kann oder möchte, zum Beispiel, wenn eine Verbindung über SSH besteht.
ccpizza
4
@lfxgroove: Das Problem ist, dass susich der Besitz Ihres TTY nicht ändert, sodass Sie ihn manuell ändern müssen chown. Siehe diesen Artikel .
Rufflewind
2
@Starx: Du erstellst eine.
Grawity
3
Ein weiterer Tipp: Um alle verfügbaren Optionen anzuzeigen, geben Sie Folgendes ein ls /usr/bin | grep pinentry. Ich sehe pinentry, pinentry-curses, pinentry-emacs, pinentry-gnome3, pinentry-gtk2, pinentry-qtund pinentry-tty. Auf diese Weise können Sie diejenige auswählen, die besser zu Ihnen passt, wenn Sie keine Probleme haben $DISPLAY.
Jeffrey Lebowski
8

Ich hatte gerade dieses Problem unter Ubuntu 16.04.3, als ich versuchte, einen privaten Schlüssel mit gpg2 (2.1.11) auf einem Systemkonto ohne Kennwort und auf einem Benutzerkonto über ssh zu generieren / installieren. Nichts hat funktioniert

gpg: Schlüssel FE17AE6D / FE17AE6D: Fehler beim Senden an den Agenten: Berechtigung verweigert
gpg: Fehler beim Erstellen des Skey-Arrays: Berechtigung verweigert

Ich fand dann diese , die für mich gearbeitet, so in Kürze:

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

Auf einer Debian-Box:

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

(und setze es auf pinentry-tty)

John Lawrence Aspden
quelle
4

Unter Ubuntu 18.04 mit der Standardinstallation von gpg 2.2.4 habe ich

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

Ich konnte Folgendes tun, um eine textbasierte PIN-Eingabe zu erhalten:

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

Wenn Sie es nicht haben, installieren Sie es pinentry-cursesmit yum oder apt-get.

Dann renne:

sudo update-alternatives --config pinentry

Und wähle die Pinentry-Curses aus der Liste aus.

Aiden Waldmeister
quelle
2

Ich werde meine Antwort von hier kopieren ...

Auf den ersten Blick man pinentry-gnome3sehe ich Folgendes:

   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.

Leider funktioniert dieser Fallback im Textmodus bei mir nicht. Andere scheinen dasselbe Problem zu haben . Doch dieser Kommentar spornte meint ein anderes GUI Pin-Eingabeprogramm , um zu versuchen: pinentry-gtk2. Sie können wie folgt wechseln:

> 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

Sobald ich gewechselt habe, hat es perfekt für mich funktioniert! In einem Terminal auf dem Desktop wird die GUI-Kennworteingabe verwendet, aber wenn ich in meinen Computer einsteige, wird eine Kennworteingabe im Textmodus verwendet.

mblythe
quelle
1

Um das Pinentry-Popup zu verhindern, könnten Sie ssh localhost. Optionales Erzwingen von X11 deaktiviert, -x Disables X11 forwarding.siehe das vollständige Beispiel unten.

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
quelle
3
Welche X11-Funktionen sollten speziell deaktiviert werden? Ich persönlich kenne die Antwort auf meine Frage nicht, der Autor scheint die Antwort ohne diese Informationen unvollständig zu sein.
Ramhound
ssh'ing zum lokalen Host war genug für mich, sollte aber optional -x Disables X11 forwarding.jede X11-Weiterleitung verhindern. Antwort wird aktualisiert.
PvdL
Ich bevorzuge diese Lösung, da die Eingabe von -X nicht angezeigt wird. Normalerweise bin ich physisch an meinem Laptop, wo ich die Eingabe von X möchte (ich möchte also nicht die ganze Zeit eine Conf-Datei bearbeiten), aber wenn Ich füge ssh -X hinzu, ich möchte vielleicht noch einen Fluch-Pinentry. Im Idealfall würde die GTK-Eingabe natürlich über SSH-X funktionieren: - /
Unhammer
1

Ich fand das "vollständige Beispiel" in der Antwort von PvdL etwas verwirrend. Ich mache Folgendes:

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
unhammer
quelle
0

Wenn Sie das tun export GPG_TTY=$(tty)und unset DISPLAYes wird ein TLI Dialogfeld mit der Frage für das Passwort geben. Wenn Sie die richtige Passphrase eingeben, wird sie entschlüsselt.

Wenn Sie den obigen Export von GPG_TTY NICHT ausführen und DISPLAY deaktivieren, wird erwartet, dass X Windows verwendet wird. Wenn Sie Ihre Sitzung (z. B. PuTTY) von einem MS-Windows-System mit aktivierter X11-Weiterleitung gestartet haben, möchten Sie das X-Window-Dialogfeld an Ihr MS-Windows-System senden. Sie können einen X-Emulator wie Exceed oder Cygwin / X unter Windows verwenden, damit die X-Window-Aufforderung zur Eingabe der Passphrase auf Ihrer MS-Windows-Box angezeigt wird.

Sie können jedoch die Notwendigkeit beseitigen, GPG_TTY festzulegen und DISPLAY zu deaktivieren und entweder die TLI oder die GUI abzurufen, indem Sie die Befehlszeile mit der --batchOption ausführen und die Passphrase mit der --passphraseOption eingeben :

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

Alle 3 Methoden haben heute bei mir auf RHEL6 mit gnupg2 funktioniert.

MensaWater
quelle
2
Nach Roc Whites Antwort , export GPG_TTY=$(tty)ist ausreichend. Hast du das versucht? Haben Sie eine Referenz , die sagt , dass unset DISPLAYist auch notwendig? PS Leute mögen es nicht, Passphrasen in die Kommandozeile zu schreiben.
Scott,