Как подписывать файлы с помощью инструментов командной строки Ubuntu и моих собственных ключей?

14

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

Программное обеспечение - это проект хобби с открытым исходным кодом, поэтому я не хочу тратить деньги на покупку официального сертификата. Вместо этого я предполагаю, что основная программа всегда действительна и ей можно доверять без дополнительной проверки. Если кто-то загрузит его из любого другого места, кроме моего репозитория GitHub, это его вина.

Из того, что я прочитал, подписывание обычно выполняется путем создания пары асимметричных ключей, вычисления надежного криптографического значения хеша (например, SHA-512) из ​​файла кода, шифрования хеша с использованием моего личного ключа и сохранения этой подписи в отдельном файле. быть отправленным с оригинальным файлом кода.
Затем основной программе придется расшифровать подпись с помощью открытого ключа, который сохраняется в виде простого текста в исходном коде основной программы, вычислить ту же хеш-функцию файла кода, а затем сравнить ее с расшифрованной. Если они совпадают, плагин можно доверять.

Итак, теперь мой вопрос:

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

Byte Commander
источник

Ответы:

19

Большая часть этого ответа взята из Arch Wiki и документации GnuPG . Любые рекомендации в этом ответе - только мое мнение, и должны быть взяты с тонной соли.

Создание ключа PGP

графический интерфейс пользователя

  1. Откройте приложение « Пароли и ключи» (aka seahorse) и нажмите +(или перейдите в « Файл» -> « Создать» или нажмите CtrlN), чтобы увидеть:

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

  2. Выберите ключ PGP и введите свои данные. Я выдает себя за Byte Commander:

    диалог ключевых деталей

    RSA и 2048 бит подходят для большинства целей. Если вы хотите использовать его только для подписи, выберите опцию RSA (только подпись) в раскрывающемся меню, но вам это не нужно - это можно сделать с помощью подразделов . Вы можете оставить комментарий. Сохранение даты истечения срока действия ключа также полезно. Нажмите Create.

  3. Введите подходящий длинный пароль (и я имею в виду длинный , мой пример короткий, IMO) и нажмите Ok:

    диалог ввода пароля

    У Seahorse, кажется, нет никакой обратной связи, в отличие от 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 ведет себя как Оливер Твист. :П

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

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

графический интерфейс пользователя

Вернитесь к списку ключей 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 .

подписание

Я пока не знаю удобного графического метода подписания документа.

Создав файл, который вы хотите подписать, отправляйтесь в терминал. Попробуй 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кодировке base64, используя опцию (ASCII-защита).

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

Чтобы подписать скрипт, вы можете:

  • используйте пустую ключевую фразу для ключа
  • в зависимости от вашей версии GnuPG, отправьте фразу-пароль через stdin. Посмотрите этот пост Unix & Linux для некоторых опций.
Мур
источник
Очень хороший и подробный ответ. Но насчет примеров ключей, которые вы создали ... Я не знаю, слишком ли я рад тому факту, что множество неиспользуемых ключей для моего псевдонима лежат вокруг. Если я захочу позже создать настоящие ключи с этим именем и использовать их, люди, которые их ищут, могут запутаться. Я предполагаю, что ключи вашего примера и мои настоящие ключи смогут сосуществовать из-за разных адресов электронной почты и, следовательно, получить другой идентификатор, но все же ... Возможно ли, что вы снова сможете удалить эти ключи?
Byte Commander
@ByteCommander - это отзыв . Я посмотрю на их отмену. В связи с этим я должен добавить раздел об отзыве ключей.
Муру
@ByteCommander извините, я удалил ключ, который я опубликовал (и не сделал сертификат отзыва (классическая ошибка n00b), поэтому я не могу отозвать этот ключ. Однако срок его действия истекает один год, так что, хорошо, любая путаница будет решена через год
Муру
Хорошо, хорошо - это происходит. Не уверен, должен ли я быть раздражен или просто смеяться над этой глупой ошибкой ... Я думаю, что для моего рассматриваемого проекта я бы просто использовал модуль Python, rsaкоторый легко позволяет подписывать данные, не борясь со всеми вещами GPG. Это может стать очень полезным, когда я начну публиковать и упаковывать программное обеспечение по-настоящему, но, вероятно, это слишком много для моих целей в данный момент. Так что до тех пор, вероятно, он истечет! :)
Byte Commander
@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>"
    
AB
источник