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

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

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

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

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

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

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

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

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

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

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

  2. Выберите PGP-ключ и введите свои данные. Я олицетворяю Байт Командующий:

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

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

  3. Введите достаточно длинный пароль (и я хочу сказать, длинный , мой пример короткий, IMO) и нажмите « ОК» :

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

    В отличие от CLI, у Seahorse нет обратной связи. Подождите некоторое время, делая то, что вы хотите сделать, в то время как он собирает энтропию и создает ключ. Это может занять некоторое время. После этого вы увидите, что они входят в раздел PGP Keys :

    список ключей 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 (см. Последний скриншот). Выберите ключ (ы), который вы хотите экспортировать, и в меню « Удаленное» выберите « Синхронизировать» и «Опубликовать ключи» :

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

Кнопка « Синхронизация» будет отключена, если вы не выбрали сервер для публикации. Сделайте это, нажав кнопку « Основные серверы» :

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

Я выбрал сервер Ubuntu.

Теперь вы можете нажать кнопку « Синхронизация» и опубликовать ее на сервере ключей 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 -кодированными данными с --armor опции --armor (ASCII-armored).

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

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

  • используйте пустую кодовую фразу для ключа
  • в зависимости от вашей версии GnuPG, отправьте кодовую фразу через stdin . См. Эту статью Unix и Linux для некоторых опций.
  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>"