Як підписувати файли за допомогою інструментів командного рядка Ubuntu та власних ключів?


14

Я хочу підписати кілька файлів коду Python, які я написав, оскільки вони є модулями для плагінів для одного з моїх проектів. Для його розповсюдження я хочу, щоб користувач міг бути впевненим, що плагін перевірений і безпечний (тому що написаний мною або ким я довіряю) і не був змінений.

Програмне забезпечення - це лише проект хобі з відкритим кодом, тому я не хочу витрачати гроші на придбання офіційного сертифіката. Натомість я припускаю, що основна програма завжди дійсна і їй можна довіряти без додаткової перевірки. Якщо хтось завантажує його з будь-якого іншого місця, крім мого сховища GitHub, це їхня вина.

З того, що я читав, підпис зазвичай виконується шляхом створення асиметричної пари ключів, обчислення сильного криптографічного хеш-значення (наприклад, SHA-512) з кодового файлу, шифрування хеша за допомогою мого приватного ключа та зберігання цього підпису в окремому файлі буде доставлений з оригінальним файлом коду.
Після цього головній програмі доведеться розшифрувати підпис за допомогою відкритого ключа, який зберігається у простому тексті у вихідному коді основної програми, обчислити ту саму хеш-функцію файлу коду та порівняти її з розшифрованою. Якщо вони відповідають, плагіну можна довіряти.

Тому тепер моє запитання:

Як мені легко створити міцну асиметричну пару ключів за допомогою інструментів Ubuntu і як мені легко обчислити криптографічне хеш-значення файлу?
Автоматизація процесу підписання в сценарії (використовуючи завжди один і той же ключ) було б чудово.

Відповіді:


19

Значна частина цієї відповіді вилучається з Arch Wiki та документації GnuPG . Будь-які рекомендації у цій відповіді - суто моя думка, і їх слід приймати з тоною солі.

Створення ключа PGP

GUI

  1. Відкрийте додаток Пароль і ключі (ака seahorse) і натисніть +(або перейдіть до Файл -> Новий або натисніть CtrlN), щоб побачити:

    діалог нового елемента для Seahorse

  2. Виберіть ключ PGP та введіть свої дані. Я видаю себе за команду Byte Commander:

    діалог основних деталей

    RSA та 2048 біт чудово підходять для більшості цілей. Якщо ви хочете використовувати його лише для підписання, виберіть параметр RSA (лише знак) зі спадного меню, але це не потрібно - це можна впоратися за допомогою підрозділів . Ви можете залишити коментар. Збереження дати закінчення терміну придатності також є корисним. Клацніть 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 діє як Олівер Твіст. : P

Публікація вашого ключа

Тепер нам потрібно дістати наш відкритий ключ, щоб люди могли перевірити речі за допомогою нього.

GUI

Поверніться до списку PGP-ключів у seahorseдодатку (див. Останній скріншот). Виберіть ключі, які потрібно експортувати, і в меню « Віддалене » виберіть « Синхронізувати та опублікувати ключі» :

введіть тут опис зображення

SyncКнопка буде відключена , якщо ви не вибрали сервер для публікації. Зробіть це, натиснувши Key Serversкнопку:

введіть тут опис зображення

Я вибрав сервер Ubuntu.

Тепер ви можете натиснути Syncкнопку та опублікувати її на сервері ключів 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

Вибачте, MIT .

Підписання

Я ще не знаю зручного способу підпису документа в 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, використовуючи --armorпараметр (ASCII-броньований).

Автоматизація

Для підписання сценарію ви можете:

  • використовувати порожню парольну фразу для ключа
  • залежно від вашої версії GnuPG, надішліть пароль через stdin. Перегляньте цю публікацію на Unix та Linux для деяких варіантів.

Дуже приємна і детальна відповідь. А ось щодо прикладних ключів, які ви створили ... Я не знаю, чи я занадто радий тому, що набір лежить на наборі невикористаних ключів мого псевдоніма. Якщо я хочу пізніше створити справжні ключі з цим іменем і використовувати їх, люди, які шукають їх, можуть заплутатися. Я думаю, що ваші приклади та мої справжні ключі зможуть співіснувати через різні адреси електронної пошти і, отже, отримати інший ідентифікатор, але все-таки ... Чи можливо ви можете видалити ці ключі знову?
Байт-командир

@ByteCommander термін скасовується . Я розглядаю, як їх скасувати. Для цього я повинен додати розділ про відкликання ключів.
muru

@ByteCommander Вибачте, я видалив опублікований вами ключ (і не зробив сертифікат відкликання (класична помилка n00b), тому не можу відкликати цей ключ. Однак у нього термін дії закінчується один рік, так що, ну будь-яка плутанина буде вирішена через рік
muru

Гаразд, добре - це буває. Не впевнений, чи варто мені дратуватися чи просто сміятися з цієї дурної помилки ... Я думаю, що для мого проекту, про який йдеться, я скоріше просто використовую модуль Python, rsaякий легко дозволяє підписувати дані, не бореться з усіма елементами GPG. Це може стати дуже корисним, коли я починаю публікувати та упаковувати програмне забезпечення для реального, але, мабуть, занадто багато для моєї мети на той самий момент. Тож до тих пір він, ймовірно, закінчиться! :)
Байт командир

@ByteCommander обидва, я думаю. Хоча я б запропонував вам використовувати своє справжнє ім’я під час створення свого ключа, а залишити псевдонім для поля коментарів.
муру

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>"
    
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.