วิธีการบังคับให้ GPG ใช้ pinentry ในโหมดคอนโซลเพื่อขอรหัสผ่าน?


75

การใช้ gpg จากสภาพแวดล้อมแบบคอนโซลเช่นเซสชัน ssh ล้มเหลวเนื่องจากไม่สามารถแสดงไดอะล็อก GTK pinentry ในเซสชัน SSH

ฉันพยายามunset DISPLAYแต่มันก็ไม่ได้ช่วย ตัวเลือกบรรทัดคำสั่ง GPG ไม่มีสวิตช์สำหรับบังคับให้ pinentry เข้าสู่โหมดคอนโซล

รุ่น GPG ที่เก่ากว่านำเสนอพรอมต์ข้อความที่ใช้งานได้ดีในเซสชัน SSH แต่หลังจากการอัปเกรดจะล้มเหลว

มี--textmodeสวิตช์บรรทัดคำสั่ง แต่เห็นได้ชัดว่ามันทำอย่างอื่น

อะไรจะเป็นวิธีที่เหมาะสมและสะอาดในการรับรายการพินแบบข้อความล้วนสำหรับเซสชันระยะไกล


DISPLAY="" gpg2 ...ช่วยให้ฉันฉันยังติดตั้ง pinentry-สาปแช่ง + pinentry-TTY ก่อนไม่แน่ใจว่าพวกเขามีความจำเป็นอย่างเคร่งครัด
ThorSummoner

คำตอบ:


89

ในการเปลี่ยนพินเนอร์อย่างถาวรให้เพิ่มรายการต่อไปนี้ใน~/.gnupg/gpg-agent.conf:

pinentry-program /usr/bin/pinentry-tty

(ในเวอร์ชันเก่าที่ไม่มี pinentry-tty ให้ใช้ pinentry-curses สำหรับหน้าต่างโต้ตอบ 'full-terminal')

บอกตัวแทนของ GPG เพื่อโหลดการกำหนดค่าใหม่:

gpg-connect-agent reloadagent /bye

9
มันไม่ได้ "สมบูรณ์" อย่างสมบูรณ์ ปกติgpg-agentตัวเองควรตรวจสอบการแสดงตนหรือขาด$DISPLAYและเลือก pinentry apropriate ...
grawity

6
เอเจนต์มีความสามารถในการตรวจจับการปรากฏตัวของ xorg ที่กำลังทำงานอยู่ แต่การมีคำDISPLAYจำกัดความไม่ได้หมายความว่าฉันสามารถหรือต้องการใช้ตัวอย่างเช่นเมื่อเชื่อมต่อผ่าน SSH
ccpizza

4
@lfxgroove: ปัญหาคือsuไม่ได้เปลี่ยนความเป็นเจ้าของของ TTY ของคุณดังนั้นคุณต้องด้วยตนเองchownมัน ดูบทความนี้
Rufflewind

2
@Starx: คุณสร้างขึ้นมา
grawity

3
เคล็ดลับอื่น: ls /usr/bin | grep pinentryเพื่อดูตัวเลือกทั้งหมดที่มีอยู่ชนิด ฉันเห็นpinentry, pinentry-curses, pinentry-emacs, pinentry-gnome3, pinentry-gtk2, และpinentry-qt pinentry-ttyวิธีนี้คุณสามารถเลือกสิ่งที่เหมาะกับคุณได้ดีกว่าถ้าคุณไม่มี$DISPLAYปัญหา
Jeffrey Lebowski

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

และเลือก pinentry-curses จากรายการ


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.

น่าเสียดายที่การย้อนกลับโหมดข้อความนี้ใช้ไม่ได้สำหรับฉัน ดูเหมือนว่าคนอื่น ๆ มีเดียวกัน ปัญหา อย่างไรก็ตามความคิดเห็นนี้กระตุ้นของฉันที่จะลองใช้โปรแกรม 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 แต่เมื่อฉันเข้าสู่เครื่องของฉันมันจะใช้รายการรหัสผ่านโหมดข้อความ


1

เพื่อป้องกันไม่ให้ป๊อปอัพ pinentry 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 จะทำงานกับ 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มันจะให้กล่องโต้ตอบ TLI ถามรหัสผ่าน การพิมพ์ข้อความรหัสผ่านที่ถูกต้องทำให้ถอดรหัสได้

หากคุณไม่ส่งออก 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
ตามคำตอบ Roc ขาว , export GPG_TTY=$(tty)ก็เพียงพอแล้ว คุณเคยลองไหม คุณมีการอ้างอิงที่บอกว่าunset DISPLAYเป็นยังจำเป็น? PS คนไม่ชอบใส่วลีรหัสผ่านในบรรทัดคำสั่ง
สกอตต์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.