Как заставить GPG использовать pinentry в режиме консоли для запроса паролей?


76

Использование gpg из консольной среды, такой как сеансы ssh, завершается неудачно, потому что диалог сеанса GTK не может быть показан в сеансе SSH.

Я пытался, unset DISPLAYно это не помогло. Опции командной строки GPG не включают в себя переключатель для принудительного ввода ввода в консольный режим.

В старых версиях GPG предлагалось текстовое приглашение, которое отлично работало в сеансах SSH, но после обновления оно просто не удавалось.

Есть --textmodeпереключатель командной строки, но, видимо, он делает что-то еще.

Каков был бы правильный и чистый способ получения ввода пин-кода в виде простого текста для удаленных сеансов?


DISPLAY="" gpg2 ...мне помогли, я тоже заранее установил pinentry-curses + pinentry-tty, не уверен, если они строго необходимы
ThorSummoner

Ответы:


90

Чтобы навсегда изменить пинентри, добавьте следующее к вашему ~/.gnupg/gpg-agent.conf:

pinentry-program /usr/bin/pinentry-tty

(В более старых версиях, где отсутствует pinentry-tty, используйте pinentry-curses для диалогового окна «полный терминал».)

Скажите агенту GPG для перезагрузки конфигурации:

gpg-connect-agent reloadagent /bye

9
Это не совсем "вменяемый". Как правило, gpg-agentдолжен сам обнаружить наличие или отсутствие $DISPLAYи выбрать подходящую пинентри ...
grawity 19.12.12

6
Агент, скорее всего, способен обнаруживать присутствие работающего xorg. Но наличие DISPLAYопределенного не обязательно означает, что я могу или хочу использовать его, например, при подключении через SSH.
ccpizza

4
@lfxgroove: проблема в том, что suэто не меняет владельца вашего TTY, поэтому вам нужно сделать chownэто вручную . Смотрите эту статью .
Rufflewind

2
@Starx: вы создаете один.
Гравитация

3
Другой совет: чтобы просмотреть все доступные варианты, введите ls /usr/bin | grep pinentry. Я вижу pinentry, pinentry-curses, pinentry-emacs, pinentry-gnome3, pinentry-gtk2, pinentry-qtи pinentry-tty. Таким образом, вы можете выбрать тот, который подходит вам лучше, если у вас нет недостатка в $DISPLAYпроблеме.
Джеффри Лебовски

8

Я только что столкнулся с этой проблемой в Ubuntu 16.04.3 при попытке создать / установить закрытый ключ с помощью gpg2 (2.1.11) для системной учетной записи без пароля и для учетной записи пользователя через ssh. Ничего не получалось, давая:

gpg: ключ FE17AE6D / FE17AE6D: ошибка отправки агенту: отказано в разрешении
gpg: ошибка построения массива skey: отказано в разрешении

Затем я обнаружил, что это работает для меня, так вкратце:

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


4

На Ubuntu 18.04, с установкой по умолчанию gpg 2.2.4, у меня есть

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

Мне удалось сделать следующее, чтобы получить текстовую запись PIN-кода:

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

3

Если у вас его нет, установите pinentry-cursesс помощью yum или apt-get.

Затем запустите:

sudo update-alternatives --config pinentry

И выберите пинентри-проклятия из списка.


2

Я скопирую свой ответ отсюда ...

Глядя на man pinentry-gnome3, я вижу это:

   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.

К сожалению, этот запасной вариант текстового режима не работает для меня. Кажется, у других есть такая же проблема . Тем не менее, этот комментарий стимулировал My попробовать другую GUI программу пин-запись: pinentry-gtk2. Вы можете переключиться так:

> 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

Как только я переключился, у меня все заработало отлично! В терминале на рабочем столе он будет использовать ввод пароля GUI, но когда я зайду ssh на свою машину, он будет использовать ввод пароля в текстовом режиме.


1

Чтобы предотвратить всплывающее окно, вы можете ssh localhost. Опционально принудительное отключение X11, -x Disables X11 forwarding.см. Полный пример ниже.

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
Какие функции X11 конкретно должны быть отключены? Я лично знаю ответ на мой вопрос, автор не знает, поэтому ответ кажется неполным без этой информации.
Ramhound

Мне было достаточно ssh'ing для локального хоста, но при желании -x Disables X11 forwarding.следует предотвратить пересылку X11. Ответ обновлен.
PvdL

Я предпочитаю это решение, учитывая, что pinentry over -X не отображается - я обычно физически на своем ноутбуке, где я хочу X pinentry (поэтому я не хочу редактировать файл conf все время), но если Я случайно попал в ssh -X, я все еще хотел бы проклятие проклятий. Конечно, в идеале, gtk pinentry будет работать над ssh -X: - /
unhammer

1

Я нашел «полный пример» в ответе PvdL немного запутанным, вот что я делаю:

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

Если вы делаете , export GPG_TTY=$(tty)и unset DISPLAYэто даст диалоговое окно с запросом ИТ парольной фразы. Ввод правильного пароля делает его расшифровать.

Если вы НЕ выполняете вышеупомянутый экспорт GPG_TTY и не устанавливаете DISPLAY, он ожидает использовать X Windows. Если вы запустили сеанс (например, PuTTY) из системы MS-Windows с включенной переадресацией X11, он хочет отправить диалоговое окно X-Window в вашу систему MS Windows. Вы можете использовать эмулятор X, такой как Exceed или Cygwin / X, в Windows, чтобы приглашение X-Window для ключевой фразы появилось в вашем окне MS-Windows.

Тем не менее, вы можете избавиться от необходимости устанавливать GPG_TTY и сбрасывать DISPLAY и получать либо TLI, либо GUI, запустив командную строку с --batchпараметром и введя фразу-пароль с --passphraseпараметром:

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

У меня все 3 метода работали сегодня на RHEL6 под управлением gnupg2.


2
Согласно ответу Рока Уайта , этого export GPG_TTY=$(tty)достаточно. Вы пробовали это? У вас есть ссылка, в которой говорится, что unset DISPLAYэто тоже необходимо? PS Люди не любят ставить парольные фразы в командной строке.
Скотт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.