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

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

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

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

Таким образом, теперь мой вопрос:

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

14
задан 28 September 2015 в 02:13

2 ответа

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

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

GUI

  1. Откройте Passwords и приложение Keys (иначе seahorse), и щелчок + (или перейдите к Файлу-> Новый, или нажмите CtrlN) для наблюдения:

    new item dialog for Seahorse

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

    key details dialog

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

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

    password entry dialog

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

    list of pgp keys

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

enter image description here

Кнопка Sync будет отключена, если Вы не выбрали сервер для публикации к. Сделайте так путем нажатия на кнопку Key Servers:

enter image description here

Я выбрал сервер 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

Извините, 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:

enter image description here

Если у получателя есть Ваш открытый ключ, они могут проверить его или получить дешифрованное содержание:

$ 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>"

Примечание:

В encryption+signing и в отдельных подписях, выводе gpg является двоичным. Вы можете сделать, чтобы GnuPG произвел base64-закодированные данные с помощью --armor опция (бронируется ASCII).

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

К подписанию сценария Вы могли:

  • используйте пустой пароль для ключа
  • в зависимости от Вашей версии GnuPG отправьте пароль через stdin. См. это сообщение Unix & Linux для некоторых опций.
19
ответ дан 23 November 2019 в 02:58
  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>"
    
4
ответ дан 23 November 2019 в 02:58

Другие вопросы по тегам:

Похожие вопросы: