วิธีลงชื่อไฟล์ด้วยเครื่องมือบรรทัดคำสั่งของ Ubuntu และกุญแจของฉันเอง


14

ฉันต้องการลงชื่อไฟล์ Python บางไฟล์ที่ฉันเขียนเพราะเป็นโมดูลเสริมสำหรับโครงการของฉัน สำหรับการแจกจ่ายนั้นฉันต้องการให้ผู้ใช้มั่นใจได้ว่าปลั๊กอินนั้นได้รับการตรวจสอบและปลอดภัย (เพราะเขียนโดยฉันหรือคนที่ฉันเชื่อถือ) และไม่ได้ทำการแก้ไข

ซอฟต์แวร์เป็นเพียงโครงการงานอดิเรกโอเพ่นซอร์สดังนั้นฉันไม่ต้องการใช้เงินเพื่อซื้อใบรับรองอย่างเป็นทางการ แต่ฉันคิดว่าโปรแกรมหลักนั้นใช้ได้เสมอและสามารถเชื่อถือได้โดยไม่ต้องมีการตรวจสอบเพิ่มเติม ถ้าใครบางคนดาวน์โหลดมันจากตำแหน่งอื่นนอกเหนือจากที่เก็บ GitHub ของฉันมันเป็นความผิดของพวกเขา

จากสิ่งที่ฉันได้อ่านการลงนามมักจะทำโดยการสร้างคู่คีย์แบบอสมมาตรการคำนวณค่าแฮชการเข้ารหัสที่แข็งแกร่ง (เช่น SHA-512) จากไฟล์รหัสการเข้ารหัสแฮชโดยใช้คีย์ส่วนตัวของฉันและเก็บลายเซ็นนั้นไว้ในไฟล์แยกต่างหาก ที่จะจัดส่งพร้อมกับไฟล์รหัสต้นฉบับ
โปรแกรมหลักจะต้องถอดรหัสลายเซ็นโดยใช้กุญแจสาธารณะที่บันทึกไว้ในข้อความธรรมดาในซอร์สโค้ดของโปรแกรมหลักคำนวณฟังก์ชันแฮชเดียวกันของไฟล์รหัสแล้วเปรียบเทียบกับรหัสที่ถอดรหัส หากตรงกันจะสามารถเชื่อถือได้ปลั๊กอิน

ดังนั้นตอนนี้คำถามของฉัน:

ฉันจะสร้างคู่คีย์แบบอสมมาตรที่แข็งแกร่งกับเครื่องมือ Ubuntu ได้อย่างง่ายดายได้อย่างไรและฉันจะคำนวณค่าแฮชเข้ารหัสของไฟล์ได้อย่างไร
การทำให้กระบวนการเซ็นชื่อในสคริปต์เป็นแบบอัตโนมัติ (ใช้รหัสเดิมเสมอ) จะยอดเยี่ยม

คำตอบ:


19

มากของคำตอบนี้จะฉีกออกจากโค้งวิกิพีเดียและเอกสาร GnuPG คำแนะนำใด ๆ ในคำตอบนี้เป็นความเห็นของฉันอย่างหมดจดและควรใช้เกลือหนึ่งตัน

การสร้างคีย์ PGP

GUI

  1. เปิดแอปPasswords and Keys (aka seahorse) และคลิก+(หรือไปที่ไฟล์ -> ใหม่หรือกดCtrlN) เพื่อดู:

    กล่องโต้ตอบรายการใหม่สำหรับซีฮอร์ส

  2. เลือกคีย์ PGPแล้วป้อนรายละเอียดของคุณ ฉันแอบอ้างเป็นผู้บัญชาการ Byte:

    กล่องโต้ตอบรายละเอียดที่สำคัญ

    RSA และ 2048 บิตนั้นใช้ได้สำหรับวัตถุประสงค์ส่วนใหญ่ ถ้าคุณเพียงต้องการที่จะใช้สำหรับการลงนามให้เลือกอาร์เอส (เครื่องหมายเท่านั้น)ตัวเลือกจากเมนูแบบเลื่อนลง แต่คุณไม่จำเป็นต้อง - นี้สามารถจัดการได้โดยใช้คีย์ย่อย คุณสามารถแสดงความคิดเห็น การเก็บวันหมดอายุไว้ที่คีย์ของคุณก็มีประโยชน์เช่นกัน Createคลิก

  3. ป้อนรหัสผ่านที่ยาวพอสมควร (และฉันหมายถึงยาวตัวอย่างของฉันสั้น IMO) และคลิกOk:

    กล่องโต้ตอบการป้อนรหัสผ่าน

    ม้าน้ำดูเหมือนจะไม่ได้รับความคิดเห็นใด ๆ ซึ่งแตกต่างจาก CLI รอสักครู่ทำสิ่งที่คุณต้องการทำในขณะที่มันรวบรวมเอนโทรปีและสร้างกุญแจ มันอาจจะใช้เวลาสักครู่. หลังจากนั้นคุณจะเห็นรหัสเหล่านั้นในส่วนคีย์ PGP :

    รายการของคีย์ pgp

CLI

gpg --gen-keyการสร้างคีย์จากบรรทัดคำสั่งเป็นเพียงการทำงาน มันจะถามคุณสำหรับรายละเอียดแบบเดียวกับที่ GUI ทำ:

$ 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? 
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) 1y
Key expires at Tuesday 27 September 2016 03:45:19 PM IST
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 E-mail Address in this form:
    "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

Real name: Byte Commander
E-mail address: byte@command.er
Comment: 
You selected this USER-ID:
    "Byte Commander <byte@command.er>"

Change (N)ame, (C)omment, (E)-mail or (O)kay/(Q)uit? o
You need a Passphrase to protect your secret key.

passphrase not correctly repeated; try again.
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, use the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy!  (Need 186 more bytes)
.....+++++
+++++
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, use the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy!  (Need 80 more bytes)
....+++++

Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy!  (Need 83 more bytes)
...+++++
gpg: key 8AE670A6 marked as ultimately trusted
public and secret key created and signed.

gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   2  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 2u
gpg: next trustdb check due at 2016-09-26
pub   2048R/8AE670A6 2015-09-28 [expires: 2016-09-27]
      Key fingerprint = 82D9 0644 B265 8E75 1E01  538B B479 3CF4 8AE6 70A6
uid                  Byte Commander <byte@command.er>
sub   2048R/0E2F4FD8 2015-09-28 [expires: 2016-09-27]

สังเกตว่า GnuPG บอกเราอย่างไรว่าต้องใช้พลังงานมากขึ้น ม้าน้ำก็หวังเช่นกัน แต่แล้วอีกครั้งมันรู้สึกเหมือน GnuPG ทำหน้าที่เหมือน Oliver Twist : P

เผยแพร่คีย์ของคุณ

ตอนนี้เราต้องนำกุญแจสาธารณะของเราออกไปที่นั่นเพื่อให้ผู้คนสามารถตรวจสอบสิ่งต่าง ๆ ได้

GUI

กลับไปที่รายการของคีย์ PGP ในseahorseแอพ (ดูภาพหน้าจอล่าสุด) เลือกคีย์ที่คุณต้องการส่งออกและในเมนูระยะไกลเลือกซิงค์และเผยแพร่คีย์ :

ป้อนคำอธิบายรูปภาพที่นี่

Syncปุ่มจะปิดการใช้งานถ้าคุณยังไม่ได้เลือกเซิร์ฟเวอร์เพื่อเผยแพร่ไปยัง ทำได้โดยคลิกที่Key Serversปุ่ม:

ป้อนคำอธิบายรูปภาพที่นี่

ฉันเลือกเซิร์ฟเวอร์ของ Ubuntu

ตอนนี้คุณสามารถคลิกSyncปุ่มและเผยแพร่ไปยังkeyserver ของ Ubuntu (ขออภัยสำหรับ Ubuntu,)

CLI

ด้วย CLI คุณต้องมีรหัสคีย์ของคีย์ที่คุณต้องการเผยแพร่ เป็นบรรทัดสุดท้ายของเอาต์พุตเมื่อสร้างคีย์ ( 8AE670A6) gpg --list-keysหากคุณจำไม่ได้ว่าสิ่งที่มันเป็นเพียงแค่เรียกใช้ ในการเผยแพร่:

$ gpg  --keyserver pgp.mit.edu --send-keys 8AE670A6
gpg: sending key 8AE670A6 to hkp server pgp.mit.edu

ขออภัยเอ็มไอที

การลงชื่อ

ฉันยังไม่รู้วิธี GUI ที่สะดวกในการเซ็นเอกสาร

เมื่อคุณสร้างไฟล์ที่คุณต้องการลงชื่อแล้วให้ไปที่เทอร์มินัล ลองgpg --list-keys:

$ gpg --list-keys       
/home/muru/.gnupg/pubring.gpg
---------------------------
pub   2048R/F7878B0C 2015-09-28 [expires: 2016-09-26]
uid                  Byte Commander <byte@command.er>
sub   2048R/345B9A4F 2015-09-28 [expires: 2016-09-26]

คุณสามารถลงชื่อไฟล์โดยใช้สองวิธี:

การเซ็นชื่อด้วยการเข้ารหัส

$ gpg --sign --output examples.sig examples.desktop 

You need a passphrase to unlock the secret key for
user: "Byte Commander <byte@command.er>"
2048-bit RSA key, ID F7878B0C, created 2015-09-28

gpg: Invalid passphrase; please try again ...

You need a passphrase to unlock the secret key for
user: "Byte Commander <byte@command.er>"
2048-bit RSA key, ID F7878B0C, created 2015-09-28

หากคุณอยู่ในเซสชันเดสก์ท็อปโอกาสที่คุณจะได้รับการต้อนรับด้วยพรอมต์รหัสผ่านแบบกราฟิก ตัวอย่างเช่นใน GNOME:

ป้อนคำอธิบายรูปภาพที่นี่

หากผู้รับมีรหัสสาธารณะของคุณพวกเขาสามารถตรวจสอบหรือรับเนื้อหาถอดรหัส:

$ gpg --verify examples.sig
gpg: Signature made Monday 28 September 2015 03:25:00 PM IST using RSA key ID F7878B0C
gpg: Good signature from "Byte Commander <byte@command.er>"
$ gpg --decrypt examples.sig
[Desktop Entry]
Version=1.0
Type=Link
Name=Examples
Name[aa]=Ceelallo
...
URL=file:///usr/share/example-content/
Icon=folder
X-Ubuntu-Gettext-Domain=example-content

gpg: Signature made Monday 28 September 2015 03:25:00 PM IST using RSA key ID F7878B0C
gpg: Good signature from "Byte Commander <byte@command.er>"

การลงนามด้วยข้อความธรรมดา

คุณอาจไม่ต้องการเข้ารหัสเนื้อหาเช่นเมื่อส่งจดหมาย ในกรณีนี้ให้ใช้--clearsignตัวเลือก:

$ gpg --clearsign examples.desktop 

You need a passphrase to unlock the secret key for
user: "Byte Commander <byte@command.er>"
2048-bit RSA key, ID F7878B0C, created 2015-09-28

$ cat examples.desktop.asc 
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

[Desktop Entry]
Version=1.0
Type=Link
Name=Examples
Name[aa]=Ceelallo
...
URL=file:///usr/share/example-content/
Icon=folder
X-Ubuntu-Gettext-Domain=example-content

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1

iQEcBAEBAgAGBQJWCRAaAAoJEGUZkqX3h4sMBWsH/1yw+G0v5Ck+T3PBS90SkvC8
5C0FJeGVr0AgYQohhsE3zEGQ7nn53N7JsvNlF6VccvN99DZIp18JbrJ+qs5hWjtg
KU/ACleR5dvVrJgfjppkuC8Q3cAudvqciKlLjA7Xycr3P49oCNCy8k/ue2TrgCvS
mMb5IS/kqpO7wrOMBAR0c/2CjQsA91S1/YK7DbuUqeNgEzW1grsI7XZPhiDGpAib
D20HWrbdLhklAEJuo1EvuOIggW6MF6ksxDoVapsUzQalD0TWEq6OnvzIS5qhITrc
XaDPQJpiHyCyINnL5aZCUwr2uon7osJ+2a8Ahp1REpzIZTdND9jA5NWSel5+yAs=
=ZrtB
-----END PGP SIGNATURE-----

การเซ็นชื่อพร้อมไฟล์แยกต่างหากสำหรับลายเซ็น (ลายเซ็นเดี่ยว)

สุดท้ายสำหรับไฟล์บางไฟล์คุณไม่สามารถมีลายเซ็นในเอกสาร ตัวอย่างเช่นไฟล์แพ็กเกจหรือข้อมูลเมตาสำหรับที่เก็บทั้งคู่มีเนื้อหาที่มีลักษณะเฉพาะที่ไม่อนุญาตลายเซ็นแบบฝังได้อย่างง่ายดาย ในกรณีนี้คุณใช้--detached-sigตัวเลือก:

$ gpg --output examples.desktop.sig --detach-sign examples.desktop

You need a passphrase to unlock the secret key for
user: "Byte Commander <byte@command.er>"
2048-bit RSA key, ID F7878B0C, created 2015-09-28

$ gpg --verify examples.desktop.sig examples.desktop
gpg: Signature made Monday 28 September 2015 03:35:55 PM IST using RSA key ID F7878B0C
gpg: Good signature from "Byte Commander <byte@command.er>"

บันทึก

ในการเข้ารหัส + การลงนามและในลายเซ็นเดี่ยวออกของgpgเป็นไบนารี คุณสามารถมี GnuPG output base64-encoded data โดยใช้--armorตัวเลือก (ASCII-armored)

การทำงานอัตโนมัติ

หากต้องการลงชื่อสคริปต์คุณสามารถ:

  • ใช้วลีรหัสผ่านที่ว่างเปล่าสำหรับคีย์
  • ขึ้นอยู่กับรุ่นของ GnuPG stdinส่งรหัสผ่านทาง ดูโพสต์ Unix & Linuxสำหรับตัวเลือกบางอย่าง

คำตอบที่ดีมากและมีรายละเอียด แต่เกี่ยวกับปุ่มตัวอย่างที่คุณสร้างขึ้น ... ฉันไม่รู้ว่าฉันมีความสุขเกินไปหรือไม่ที่มีชุดคีย์ที่ไม่ได้ใช้สำหรับนามแฝงของฉันวางอยู่รอบตัว หากฉันต้องการสร้างคีย์จริงด้วยชื่อนั้นในภายหลังและใช้พวกเขาคนที่ค้นหาพวกเขาอาจสับสน ฉันเดาว่าคีย์ตัวอย่างของคุณและกุญแจจริงของฉันจะสามารถอยู่ร่วมกันได้เนื่องจากที่อยู่อีเมลที่แตกต่างกันและดังนั้นจึงได้รับ ID ที่แตกต่างกัน แต่ยัง ... มันเป็นไปได้หรือไม่ที่คุณอาจลบคีย์เหล่านั้นอีกครั้ง
ผู้บัญชาการไบต์

@ByteCommander ระยะคือเพิกถอน ฉันจะดูการเพิกถอนพวกเขา สำหรับเรื่องนั้นฉันควรเพิ่มหัวข้อในการเพิกถอนกุญแจ
muru

@ ByteCommander ขอโทษด้วยฉันลบรหัสที่ฉันเผยแพร่ (และไม่ได้ทำใบรับรองการเพิกถอน (ความผิดพลาด n00b แบบคลาสสิก) ดังนั้นฉันจึงไม่สามารถเพิกถอนคีย์นั้นได้อย่างไรก็ตามมันมีอายุหนึ่งปีดังนั้น ความสับสนใด ๆ จะได้รับการแก้ไขในปี
muru

โอเค - ที่เกิดขึ้น ไม่แน่ใจว่าฉันควรจะรำคาญหรือแค่หัวเราะกับข้อผิดพลาดที่โง่เง่านั้น ... ฉันคิดว่าโครงการของฉันเป็นปัญหาฉันควรใช้โมดูล Python rsaซึ่งช่วยให้การลงนามข้อมูลทำได้ง่ายโดยไม่ต้องลำบากกับ GPG ทั้งหมด นั่นอาจจะมีประโยชน์มากเมื่อฉันเริ่มต้นการเผยแพร่และซอฟต์แวร์บรรจุภัณฑ์สำหรับของจริง แต่อาจจะมากเกินไปสำหรับวัตถุประสงค์ของฉันในขณะนี้ ดังนั้นจนกว่าจะถึงเวลาหมดอายุ! :)
ผู้บัญชาการไบต์

@ ByteCommander ฉันคิดว่าทั้งสอง แม้ว่าฉันจะแนะนำให้คุณใช้ชื่อจริงของคุณเมื่อสร้างคีย์ของคุณและปล่อยให้ช่องสำหรับความคิดเห็น
muru

4
  1. สร้างคีย์ไม่สมมาตรด้วย gpg

    gpg --gen-key
    
  2. ใช้ gpg เพื่อเซ็นชื่อไฟล์ของคุณ (ใช้รหัสส่วนตัวของคุณ)

    gpg --output foo.sig --detach-sig foo.py
    
  3. ทดสอบไฟล์ลายเซ็น (ใช้รหัสสาธารณะของคุณ)

    gpg --verify foo.sig foo.py
    

    ตัวอย่างผลลัพธ์

    % gpg --verify foo.sig foo.py 
    gpg: Signature made Mo 28 Sep 2015 12:46:04 CEST using RSA key ID 89B30DEC
    gpg: Good signature from "Your Name <your.name@host.com>"
    
    % echo "bad" >> foo.py
    
    % gpg --verify foo.sig foo.py
    gpg: Signature made Mo 28 Sep 2015 12:46:04 CEST using RSA key ID 89B30DEC
    gpg: BAD signature from "Your Name <your.name@host.com>"
    
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.