Comment forcer GPG à utiliser pinentry en mode console pour demander des mots de passe?

76

L'utilisation de gpg à partir d'un environnement basé sur une console, tel que des sessions ssh, échoue car la boîte de dialogue pinentry de GTK ne peut pas être affichée dans une session SSH.

J'ai essayé unset DISPLAYmais ça n'a pas aidé. Les options de ligne de commande GPG n'incluent pas de commutateur permettant de forcer pinentry en mode console.

Les anciennes versions de GPG offraient une invite textuelle qui fonctionnait bien dans les sessions SSH, mais elle échouait après la mise à niveau.

Il y a le --textmodecommutateur de ligne de commande mais apparemment, il fait autre chose.

Quel serait le moyen propre et approprié d’obtenir une broche en texte brut pour les sessions à distance?

ccpizza
la source
DISPLAY="" gpg2 ...m'a aidé, j'ai également installé pinentry-curses + pinentry-tty au préalable, ne sachant pas si elles sont strictement nécessaires
ThorSummoner

Réponses:

90

Pour changer le pinentry de façon permanente, ajoutez ce qui suit à votre ~/.gnupg/gpg-agent.conf:

pinentry-program /usr/bin/pinentry-tty

(Dans les versions plus anciennes dépourvues de pinentry-tty, utilisez pinentry-curses pour une fenêtre de dialogue 'terminal complet'.)

Indiquez à l'agent GPG de recharger la configuration:

gpg-connect-agent reloadagent /bye
Grawity
la source
9
Ce n'est pas complètement "sain d'esprit". Normalement, gpg-agentdevrait lui-même détecter la présence ou l'absence de $DISPLAYet choisir le pinentry approprié ...
grawity
6
L'agent est probablement capable de détecter la présence d'un xorg en cours d'exécution. Mais avoir une DISPLAYdéfinition ne signifie pas nécessairement que je peux ou veux l’utiliser, par exemple, lorsque je suis connecté via SSH.
ccpizza
4
@ lfxgroove: le problème est que sucela ne change pas la propriété de votre téléscripteur, vous devez donc le faire manuellement chown. Voir cet article .
Rufflewind
2
@ Starx: Vous en créez un.
Grawity
3
Autre astuce: pour afficher toutes les options disponibles, tapez ls /usr/bin | grep pinentry. Je vois pinentry, pinentry-curses, pinentry-emacs, pinentry-gnome3, pinentry-gtk2, pinentry-qtet pinentry-tty. De cette façon, vous pouvez choisir celui qui vous convient le mieux, si vous n'avez pas le $DISPLAYproblème.
Jeffrey Lebowski
8

Je viens d'avoir ce problème sur Ubuntu 16.04.3 lorsque j'essayais de générer / installer une clé privée à l'aide de gpg2 (2.1.11) sur un compte système sans mot de passe et sur un compte d'utilisateur via ssh. Rien n'a fonctionné donnant:

gpg: clé FE17AE6D / FE17AE6D: erreur lors de l'envoi à l'agent: autorisation refusée
gpg: erreur lors de la création du tableau de clés: autorisation refusée

J'ai ensuite trouvé ce qui a fonctionné pour moi, donc en bref:

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

Sur une boîte debian:

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

(et le régler sur pinentry-tty)

John Lawrence Aspden
la source
4

Sur Ubuntu 18.04, avec l’installation par défaut de gpg 2.2.4, j’ai

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

J'ai été capable de faire ce qui suit pour avoir une entrée de code PIN basée sur du texte:

export GPG_TTY=$(tty)
gpg-connect-agent updatestartuptty /bye >/dev/null
Roc blanc
la source
3

Si vous ne l'avez pas, installez pinentry-cursesavec yum ou apt-get.

Ensuite, lancez:

sudo update-alternatives --config pinentry

Et sélectionnez pinentry-curses dans la liste.

Woodruff Aiden
la source
2

Je recopierai ma réponse par ici ...

En regardant man pinentry-gnome3, je vois ceci:

   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.

Malheureusement, cette solution de secours en mode texte ne fonctionne pas pour moi. Il semble que d'autres ont le même problème . Cependant, ce commentaire a incité mon essayer un programme pin-entrée de GUI différente: pinentry-gtk2. Vous pouvez basculer comme ceci:

> 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

Une fois que j'ai changé, cela a parfaitement fonctionné pour moi! Dans un terminal sur le bureau, il utilisera l'entrée de mot de passe de l'interface graphique, mais lorsque je ssh dans ma machine, il utilisera une entrée de mot de passe en mode texte.

mblythe
la source
1

Pour empêcher le pop-up pinentry, vous pourriez ssh localhost. Forcer éventuellement X11 désactivé, -x Disables X11 forwarding.voir l'exemple complet ci-dessous.

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
la source
3
Quelles fonctionnalités X11 doivent être spécifiquement désactivées? Je connais personnellement la réponse à ma question, mais l'auteur ne le sait pas. La réponse semble donc incomplète sans ces informations.
Ramhound
ssh'ing à l'hôte local était suffisant pour moi, mais -x Disables X11 forwarding.devrait éventuellement empêcher toute transmission X11. La réponse est mise à jour.
PvdL
Je préfère cette solution, étant donné que pinentry plutôt que -X ne s'affiche pas - je suis normalement physiquement à mon ordinateur portable, où je veux X pinentry (donc je ne veux pas éditer un fichier de configuration tout le temps), mais si Il m'est arrivé de faire ssh -X, il se peut que je veuille encore une malédiction. Bien sûr, idéalement, le gtk pinentry fonctionnerait réellement sur ssh -X: - /
unhammer
1

J'ai trouvé le "exemple complet" dans la réponse de PvdL un peu déroutant, voici ce que je fais:

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
sans retenue
la source
0

Si vous le faites export GPG_TTY=$(tty)et unset DISPLAYcela donnera une boîte de dialogue TLI demandant la phrase secrète. Taper le mot de passe correct le déchiffre.

Si vous ne faites PAS l'exportation ci-dessus de GPG_TTY et que l'option DISPLAY n'est pas définie, il est prévu d'utiliser X Windows. Si vous avez lancé votre session (telle que PuTTY) à partir d'un système MS-Windows avec le transfert X11 activé, il souhaite envoyer la boîte de dialogue X-Window à votre système MS Windows. Vous pouvez utiliser un émulateur X tel que Exceed ou Cygwin / X sous Windows pour permettre à l'invite X-Window de la phrase secrète d'apparaître sur votre boîte de dialogue MS-Windows.

Cependant, vous pouvez éliminer le besoin de définir GPG_TTY et de désactiver DISPLAY et d'obtenir soit le TLI soit l'interface graphique en exécutant la ligne de commande avec --batchoption et en insérant la phrase secrète avec l' --passphraseoption:

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

Les 3 méthodes ont fonctionné pour moi aujourd'hui sur RHEL6 avec gnupg2.

MensaWater
la source
2
Selon la réponse de Roc White , cela export GPG_TTY=$(tty)suffit. Avez-vous essayé ça? Avez-vous une référence qui dit que unset DISPLAYc'est également nécessaire? PS Les gens n'aiment pas mettre de phrase secrète sur la ligne de commande.
Scott