GnuPG
Источник:
https://www.hacksanity.com/kb/gnupg-introduction/
https://www.hacksanity.com/kb/gnupg-create-manage-keys/
https://www.hacksanity.com/kb/gnupg-part-3-import-sign-trust-keys/
https://www.hacksanity.com/kb/gnupg-part-4-encrypt-sign-files/
2020
перевод В.Айсин
Часть 1
Введение
Введение в PGP-шифрование с помощью GnuPG в Linux.
GNU Privacy Guard (GnuPG) — это реализация стандарта шифрования OpenPGP со свободным программным обеспечением и открытым исходным кодом, наиболее известного для шифрования электронной почты, но также используемого для многих общих функций шифрования/дешифрования и подписи. GnuPG является частью проекта GNU и альтернативой проприетарному пакету криптографического программного обеспечения PGP.
Зачем изучать GnuPG?
Помимо шифрования электронной почты, GnuPG является важной частью программного обеспечения, которое лежит в основе многих важнейших частей GNU/Linux и экосистемы свободного программного обеспечения. Он используется для шифрования и подписи файлов, пакетов программного обеспечения, коммитов Git-кода и т.д. Являетесь ли вы разработчиком, системным администратором или просто энтузиастом Linux, вы, вероятно, столкнетесь с ним. Изучение GnuPG и работа с ним также дадут вам глубокое функциональное понимание криптографии с открытым ключом; и эти базовые знания помогут вам фундаментально разобраться во всех других формах шифрования, от SSL/TLS до аппаратных токенов, таких как Yubikey и Nitrokey.
История
Pretty Good Privacy (PGP) изначально был разработан Филом Циммерманом в 1991 году и имеет интересную историю. Официальное программное обеспечение PGP несколько раз меняло владельца и в настоящее время существует как проприетарное программное обеспечение, принадлежащее и разработанное Symantec (которая сейчас принадлежит Broadcom). В 1997 году PGP Inc. работала с IETF над созданием стандарта OpenPGP. Этот стандарт был использован Фондом свободного программного обеспечения (FSF) для создания GnuPG в рамках проекта GNU. Первоначальным разработчиком и основным автором GnuPG является Вернер Кох.
Установка
В этих руководствах я сосредоточусь на Linux, хотя GnuPG поддерживается в большинстве популярных операционных систем. К счастью, большинство дистрибутивов GNU/Linux поставляются с уже установленным GnuPG, поэтому я не буду тратить время на подробное описание инструкций по установке здесь. Я также предполагаю, что любой, кто хочет изучить такое программное обеспечение, вполне способен разобраться с частью установки ;). Загрузки можно найти на официальном сайте: GnuPG – Download.
Версии
Учебные пособия и пакеты Linux могут ссылаться на gpg1 и gpg2, ссылаясь соответственно на «классический» GnuPG 1.4 и «современный» GnuPG 2.x. В старых версиях Linux GnuPG 1 был установлен по умолчанию и вызывался с помощью команды gpg
. GnuPG 2 должен был устанавливаться отдельно и вызывался с помощью команды gpg2
.
В текущих версиях все наоборот. Пакеты gnupg и gpg устанавливают GnuPG 2, и теперь он вызывается командой по умолчанию gpg
. При необходимости также можно установить «классический» пакет gnupg1, который теперь вызывается командой gpg1
. Для этих руководств я предполагаю использование GnuPG 2.
GnuPG1
GnuPG 1.4, в настоящее время предоставляемый пакетом gnupg1, является «классической» автономной немодуляризованной версией. Согласно описанию пакета, он предоставляется в основном для людей, которым необходимо использовать архаичные криптографические объекты, такие как ключи PGPv3 для доступа к архивированным сообщениям. Он не поддерживает более современные криптографические примитивы, такие как ECDSA или EdDSA. Его также иногда используют для встраивания и использования на сервере, поскольку он предоставляет меньше зависимостей и двоичных файлов меньшего размера.
GnuPG2
Современный редизайн GnuPG. Он имеет модульную внутреннюю конструкцию, обеспечивающую большую гибкость и дополнительную функциональность. Он также предоставляет множество новых функций, таких как криптография на эллиптических кривых (ECDSA) с GnuPG 2.2. Для практического использования командной строки разница невелика. Следует отметить одно функциональное изменение, внесенное в GnuPG 2.1, которое прекратило хранение ключей в файлах pubring.gpg и secring.gpg. Я подробно расскажу, как хранятся ключи в данный момент, в следующей статье о создании ключей и управлении ими.
Компоненты
Программное обеспечение GnuPG состоит из нескольких компонентов, используемых для выполнения различных функций. Хотя в основном оно существует как реализация OpenPGP, в нем также есть компоненты для управления сертификатами X.509. Структура компонентов GnuPG начиная с версии 2.1 показана ниже.
Компонент | Описание |
---|---|
gpg |
OpenPGP — часть GNU Privacy Guard (GnuPG). Это инструмент для предоставления услуг цифрового шифрования и подписи с использованием стандарта OpenPGP. |
gpgsm |
Инструмент, аналогичный gpg, для предоставления услуг цифрового шифрования и подписи на сертификатах X.509 и протоколе синтаксиса криптографических сообщений (CMS). В основном он используется как серверная часть для обработки почты S/MIME и включает полнофункциональное управление сертификатами. |
gpg-agent |
Демон для управления секретными ключами независимо от любого протокола. Он используется в качестве серверной части для gpg и gpgsm, а также некоторых других утилит. |
scdaemon |
Демон для управления смарт-картами. Обычно он вызывается gpg-агентом и обычно не используется напрямую. |
dirmngr |
Сервер для управления и загрузки списков отзыва сертификатов (CRL) для сертификатов X.509 и для загрузки самих сертификатов. Dirmngr также обрабатывает запросы OCSP в качестве альтернативы CRL. Dirmngr либо вызывается внутри gpgsm (из GnuPG 2), либо запускается как системный демон инструментом dirmngr-client. |
dirmngr-client |
Простой инструмент для связи с запущенным экземпляром dirmngr и проверки того, был ли отозван сертификат — либо путем внесения в соответствующий CRL, либо путем запуска протокола OCSP. |
Установленные компоненты можно отобразить с помощью команды gpgconf --list-components
:
$ gpgconf --list-components
gpg:OpenPGP:/usr/bin/gpg
gpg-agent:Private Keys:/usr/bin/gpg-agent
scdaemon:Smartcards:/usr/lib/gnupg/scdaemon
gpgsm:S/MIME:/usr/bin/gpgsm
dirmngr:Network:/usr/bin/dirmngr
Движемся вперед
GnuPG — это загадочная и обширная часть программного обеспечения, в которой я не могу надеяться охватить все части. Цель этих руководств — охватить основные аспекты и предоставить базовые знания, которые позволят вам легко перейти к любым функциям, требующимся в ваших вариантах использования.
Часть 2
Создание ключей и управление ими
Создавайте ключи PGP с помощью GnuPG и управляйте ими.
Здесь я объясню, как использовать GnuPG в Linux для генерации пары ключей PGP, добавления подразделов, просмотра, экспорта и отзыва ключей, а также как использовать структуру хранения ключей.
Генерация ключей
Основная команда для создания пары ключей: gpg --gen-key
. При этом используются параметры по умолчанию и запрашиваются только имя и адрес электронной почты. Опция --full-gen-key
выполняет ту же функцию, но с запросами для всех параметров, таких как тип и размер ключа. Текущее значение по умолчанию — 3072-разрядные ключи RSA, действительные в течение двух лет.
$ gpg --gen-key
$ gpg --full-gen-key
Просмотр ключей
Самый простой вариант отображения текущих ключей: --list-keys
. Этот вывод может легко сбить с толку любого, кто не знаком с ним. Давайте его разберем.
$ gpg --list-keys
/home/bobby/.gnupg/pubring.kbx
-----------------------------
pub rsa3072 2020-11-11 [SC] [expires: 2022-11-11]
136FC6B4B12746249F16FEAF4405B01BFDF04FCD
uid [ultimate] Bobby <bobby@example.com>
sub rsa3072 2020-11-11 [E] [expires: 2022-11-11]
Обратите внимание, что есть ссылка на pubring.kbx
. Это связка открытых ключей; двоичный файл, в котором хранятся все ваши открытые ключи. Ниже приведены несколько строк с различной информацией. Некоторые из них просты, другие требуют большего контекста. Давайте разберем различные части.
pub , sub |
Типы ключей (см. ниже) |
rsa3072 |
Шифр, используемый в ключе |
2020-11-11 |
Дата создания ключа |
[SC] , [E] |
Флаги использования (см. ниже) |
[expires: 2022-11-11] |
Срок истечения действия ключа |
136FC6B4B12746249F16FEAF4405B01BFDF04FCD |
Отпечаток ключа (см. ниже) |
uid |
Идентификатор пользователя ключа, который представляет собой просто имя пользователя и адрес электронной почты |
[ultimate] |
Уровень доверия (см. ниже) |
Типы ключей
По умолчанию изначально создаются две пары ключей. Главный ключ (pub
) и саб-ключ (sub
). Это открытые ключи для этих пар ключей. Опция --list-secret-keys
покажет вам ту же информацию, но с указанием секретных ключей.
pub
-> Открытый ключsub
-> Открытый саб-ключsec
-> Приватный ключssb
-> Приватный саб-ключ
Флаги использования
Главному ключу и саб-ключам назначены разные функции, как указано буквами, содержащимися в скобках – [SC]
, [E]
.
C
– СертификацияS
– ПодписываниеE
– ШифрованиеA
– Аутентификация
По умолчанию мастер-ключу назначена функция сертификации (которая позволяет ему сертифицировать дополнительные подразделы) и функция подписи. Саб-ключу присвоена функция шифрования. На практике главный ключ перемещается в безопасное место и используется только для управления саб-ключами и подписывания других открытых ключей. Дополнительные саб-ключи добавляются для выполнения всех других повседневных функций. Я подробно расскажу об этом в другой статье.
Отпечаток ключа/ID ключа
Строка 136FC6B4B12746249F16FEAF4405B01BFDF04FCD
— это отпечаток ключа, используемый для идентификации пары ключей. Ключ также может быть идентифицирован с помощью ID ключа; либо 16-символьного ID, либо 8-символьного короткого ID. Они состоят из последних 16 или 8 символов в отпечатке ключа.
Отпечаток ключа | 136F C6B4 B127 4624 9F16 FEAF 4405 B01B FDF0 4FCD |
Длинный ID | ---- ---- ---- ---- ---- ---- 4405 B01B FDF0 4FCD |
Короткий ID | ---- ---- ---- ---- ---- ---- ---- ---- FDF0 4FCD |
Стоит отметить, что более старые версии GnuPG по умолчанию не отображали полный отпечаток ключа в выходных данных --list-keys
. Вместо этого они отображали короткий ID из 8 символов.
pub 3072R/FDF04FCD 2020-11-11 [expires: 2022-11-11]
Уровень доверия
Это определяет, доверяете вы ключу или нет, и используется применительно к Сети доверия (Web of Trust) при импорте открытых ключей от друзей/контактов. Это объясняется далее в части 3.
Как хранятся ключи
Чтобы получить более полное представление о том, как хранятся открытый и приватный ключи, давайте выполним команду tree
в папке .gnupg
, чтобы отобразить все файлы и содержащие их папки.
$ tree .gnupg
.
├── openpgp-revocs.d
│ └── 136FC6B4B12746249F16FEAF4405B01BFDF04FCD.rev
├── private-keys-v1.d
│ ├── AB6757B4592AE707EC64EBFB48A7AF32AE9ED369.key
│ └── D6877214052460DB7D5C764794E0CDB356C21EBD.key
├── pubring.kbx
├── pubring.kbx~
└── trustdb.gpg
2 directories, 6 files
-
Каталог
openpgp-revocs.d
содержит сертификаты отзыва, созданные при создании пар ключей. Файлы.rev
имеют имена, соответствующие отпечатку соответствующей пары ключей. -
Каталог
private-keys-v1.d
содержит приватные ключи, хранящиеся в отдельных файлах, в отличие от открытых ключей. Имя каждого из этих файлов.key
может выглядеть как отпечаток ключа, но на самом деле это keygrip. -
Файл
pubring.kbx
— это файл keybox, используемый для хранения открытых ключей в двоичном наборе ключей. Все открытые ключи хранятся в этом файле, тогда как приватные ключи хранятся в отдельных файлах. -
Файл
trustdb.gpg
— это база данных доверия, в которой хранятся уровни доверия для ключей.
Keygrip
Keygrip — это уникальный идентификатор для пары ключей, не зависящий от протокола, что означает, что он будет оставаться неизменным независимо от протокола, взаимодействующего с ключами; тогда как отпечаток ключа будет отличаться в разных протоколах. Это выходит за рамки данных руководств, но стоит отметить, что вы можете сопоставить файлы .key с соответствующей парой ключей в выводе --list-keys
, добавив опцию --with-keygrip
.
$ gpg --list-keys --with-keygrip
/home/bobby/.gnupg/pubring.kbx
-----------------------------
pub rsa3072 2020-11-11 [SC] [expires: 2022-11-11]
136FC6B4B12746249F16FEAF4405B01BFDF04FCD
Keygrip = AB6757B4592AE707EC64EBFB48A7AF32AE9ED369
uid [ultimate] Bobby <bobby@example.com>
sub rsa3072 2020-11-11 [E] [expires: 2022-11-11]
Keygrip = D6877214052460DB7D5C764794E0CDB356C21EBD
Добавить саб-ключ
Практическое использование PGP обычно требует создания дополнительных саб-ключей. Чтобы сделать это, используйте опцию --edit-key
и укажите главный ключ для добавления саб-ключа.
$ gpg --edit-key <key>
$ gpg --edit-key bobby@example.com
gpg (GnuPG) 2.2.19; Copyright (C) 2019 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.
Secret key is available.
sec rsa3072/4405B01BFDF04FCD
created: 2020-11-11 expires: 2022-11-11 usage: SC
trust: ultimate validity: ultimate
ssb rsa3072/81D92EAACC0DF0E4
created: 2020-11-11 expires: 2022-11-11 usage: E
[ultimate] (1). Bobby <bobby@example.com>
gpg>
Далее используйте команду addkey
, чтобы добавить новый саб-ключ. Вам будет предложено указать параметры. В этом случае мы добавим саб-ключ для подписи.
gpg> addkey
Please select what kind of key you want:
(3) DSA (sign only)
(4) RSA (sign only)
(5) Elgamal (encrypt only)
(6) RSA (encrypt only)
(14) Existing key from card
Your selection? 4
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072) 3072
Requested keysize is 3072 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) 2y
Key expires at Fri 11 Nov 2022 08:52:38 PM MST
Is this correct? (y/N) y
Really create? (y/N) y
Затем используйте команду save
для сохранения и выхода.
gpg> save
Теперь в списке появится новый саб-ключ для подписи.
$ gpg --list-keys
/home/bobby/.gnupg/pubring.kbx
-----------------------------
pub rsa3072 2020-11-11 [SC] [expires: 2022-11-11]
136FC6B4B12746249F16FEAF4405B01BFDF04FCD
uid [ultimate] Bobby <bobby@example.com>
sub rsa3072 2020-11-11 [E] [expires: 2022-11-11]
sub rsa3072 2020-11-11 [S] [expires: 2022-11-11]
Экспорт ключей
Ключи можно экспортировать, используя параметры --export
, которые варьируются в зависимости от того, какие ключи вы хотите экспортировать.
--export |
Экспорт открытых ключей |
--export-secret-keys |
Экспорт приватных ключей |
--export-secret-subkeys |
Экспорт только приватных саб-ключей |
По умолчанию ключи экспортируются в двоичном формате. Опция --armor
используется для экспорта ключей в виде обычного текста.
$ gpg --export --armor bobby@example.com
-----BEGIN PGP PUBLIC KEY BLOCK-----
lQGVBF+sJTkBDADDFvnyKEivlX7G32p7s8z2/yRSiLB5ufrP9ximnybwxYqgAp6z
v5v3sRkFqtWqeQLbOLM3VrLUjI+ZYZStthJX8Y0wpQizdsjqNe22N5ZRBY8GOyv8
hc2VUwWt8DX2pHwQBwZ7wcjiBiYpAdLnR1dIH4eTCGruVJzLdXeip2SG18CZZz35
--Output cut for brevity--
-----END PGP PUBLIC KEY BLOCK-----
Чтобы экспортировать ключи в файл, вы можете использовать опцию --output <filename>
или использовать стандартное перенаправление выходных данных Linux.
$ gpg --output bobby.pub --export --armor bobby@example.com
$ gpg --export --armor bobby@example.com > bobby.pub
Отзыв ключей
В случае, если вы потеряете доступ к своим ключам или приватный ключ будет скомпрометирован, вам необходимо будет иметь под рукой сертификат отзыва. Это используется для признания пары ключей недействительной и информирования других пользователей о том, что ей больше не следует доверять. В последних версиях GnuPG сертификат отзыва генерируется и сохраняется в каталоге openpgp-revocs.d
при первоначальной генерации ключей. Этот файл представлен в обычном текстовом формате и содержит описание, объясняющее, что в начале ключа ставится двоеточие для предотвращения случайного использования.
Если у вас еще нет сертификата отзыва, его можно сгенерировать с помощью опции --gen-revoke
. Вам нужно будет вывести его в файл.
$ gpg --output revoke-FDF04FCD.asc --gen-revoke FDF04FCD
Чтобы отозвать ключ, сертификат отзыва должен быть импортирован в вашу связку ключей с помощью опции --import
. В этом примере я буду использовать существующий сертификат в openpgp-revocs.d
после удаления вышеупомянутого двоеточия из файла.
$ gpg --import .gnupg/openpgp-revocs.d/136FC6B4B12746249F16FEAF4405B01BFDF04FCD.rev
Теперь ключ будет отображаться как отозванный в выводе --list-keys
.
$ gpg --list-keys
/home/bobby/.gnupg/pubring.kbx
-----------------------------
pub rsa3072 2020-11-11 [SC] [revoked: 2020-11-11]
136FC6B4B12746249F16FEAF4405B01BFDF04FCD
uid [ revoked] Bobby <bobby@example.com>
Отзыв саб-ключа
Одна из причин создания саб-ключей заключается в том, что их можно использовать для повседневных функций и при необходимости отозвать, в то время как главный ключ хранится в более безопасном месте. Параметр --edit-key
можно использовать для отзыва саб-ключа.
$ gpg --edit-key FDF04FCD
При использовании приглашения редактирования саб-ключи нумеруются в порядке убывания (хотя в выходных данных они не помечены как таковые). Например, вы могли бы использовать key 2
для выбора второго саб-ключа в списке (в данном случае саб-ключа подписи). После выбора ключа в этой строке появится звездочка (*
).
gpg> key 2
sec rsa3072/4405B01BFDF04FCD
created: 2020-11-11 expires: 2022-11-11 usage: SC
trust: ultimate validity: ultimate
ssb rsa3072/81D92EAACC0DF0E4
created: 2020-11-11 expires: 2022-11-11 usage: E
ssb* rsa3072/9AD81DC868DAFE98
created: 2020-12-04 expires: 2021-12-04 usage: S
[ultimate] (1). Bobby <bobby@example.com>
После выбора используйте команду revkey
, чтобы отменить действие саб-ключа.
gpg> revkey
Теперь в выходных данных ключ будет отображаться как отозванный вместе с датой отзыва.
sec rsa3072/4405B01BFDF04FCD
created: 2020-11-11 expires: 2022-11-11 usage: SC
trust: ultimate validity: ultimate
ssb rsa3072/81D92EAACC0DF0E4
created: 2020-11-11 expires: 2022-11-11 usage: E
The following key was revoked on 2020-12-13 by RSA key 4405B01BFDF04FCD Bobby <bobby@example.com>
ssb rsa3072/9AD81DC868DAFE98
created: 2020-12-04 revoked: 2020-12-13 usage: S
[ultimate] (1). Bobby <bobby@example.com>
Как и в случае с другими правками ключей, изменения необходимо сохранить.
gpg> save
Удаление ключей
Отзыв ключа не приводит к удалению его из вашей связки ключей. Хотя вы можете захотеть сохранить отозванный ключ на некоторое время для ведения записей, особенно если этот ключ использовался и им делились, в конечном итоге возникает необходимость очистить вашу связку ключей. Возможно, вы также захотите удалить ключи, чтобы начать все с чистого листа после практики с этим руководством.
Чтобы удалить приватный ключ, используйте опцию --delete-secret-key
.
$ gpg --delete-secret-key <key>
Чтобы удалить открытый ключ, используйте опцию --delete-key
.
$ gpg --delete-key <key>
Удаление саб-ключа
Как и в случае с другими функциями управления саб-ключами, необходимо использовать опцию --edit-key
.
$ gpg --edit-key FDF04FCD
При использовании приглашения редактирования саб-ключи нумеруются в порядке убывания (хотя в выходных данных они не помечены как таковые). Например, вы могли бы использовать key 2
для выбора второго саб-ключа в списке (в данном случае саб-ключа подписи). После выбора ключа в этой строке появится звездочка (*
).
gpg> key 2
sec rsa3072/4405B01BFDF04FCD
created: 2020-11-11 expires: 2022-11-11 usage: SC
trust: ultimate validity: ultimate
ssb rsa3072/81D92EAACC0DF0E4
created: 2020-11-11 expires: 2022-11-11 usage: E
ssb* rsa3072/9AD81DC868DAFE98
created: 2020-12-04 expires: 2021-12-04 usage: S
[ultimate] (1). Bobby <bobby@example.com>
После выбора используйте команду delkey
, чтобы удалить саб-ключ.
gpg> delkey
Как и в случае с другими правками ключей, изменения необходимо сохранить.
gpg> save
Часть 3
Импорт, подпись и ключи доверия
Как импортировать открытые ключи от других пользователей PGP, выполнять подпись ключей и как работает доверие.
Целью программного обеспечения для шифрования с открытым ключом, такого как PGP, является обеспечение безопасной связи с другими пользователями. С этой целью ваша связка ключей GnuPG используется для управления не только вашими собственными ключами, но и открытыми ключами тех, с кем вы хотите общаться. Чтобы эффективно использовать GnuPG, вы должны знать, как импортировать ключи, как подписывать их своим собственным ключом, и понимать Сеть доверия.
Импорт ключа
Допустим, Бобби и Элис хотят иметь возможность безопасно обмениваться сообщениями и файлами. Каждый из них экспортировал бы свой открытый ключ в файл, как описано в части 2. Как только они получат открытые ключи друг друга, их можно будет импортировать с помощью опции --import
.
bobby:~$ gpg --import alice.pub
Затем импортированный ключ появится на связке ключей.
bobby:~$ gpg --list-keys
/home/bobby/.gnupg/pubring.kbx
-----------------------------
pub rsa3072 2022-11-30 [SC] [expires: 2024-11-29]
526CFD74C708F2CFBBAC299EF30397D356C3E636
uid [ultimate] Bobby <bobby@example.com>
sub rsa3072 2022-11-30 [E] [expires: 2024-11-30]
sub dsa2048 2022-12-01 [S] [expires: 2024-11-30]
pub rsa3072 2022-12-01 [SC] [expires: 2024-11-30]
105B179F89F6BEEAB187EA882BC0AAE51BAFB0B3
uid [ unknown] Alice <alice@example.com>
sub rsa3072 2022-12-01 [E] [expires: 2024-11-30]
sub dsa2048 2022-12-01 [S] [expires: 2024-11-30]
Сеть доверия
Импорт ключей достаточно прост, но вы можете заметить в предыдущем выводе, что уровень доверия для ключа Алисы «unknown». Здесь на помощь приходят подписание ключа и Сеть доверия. (Осторожно, не путайте это с WOT, одноименным расширением для браузера. Они не связаны.)
В любой системе открытых ключей надежность публичного ключа подтверждается подписью этого ключа с помощью уже доверенной пары ключей. Приватный ключ этой пары ключей используется для подписи, и любой, у кого есть соответствующий открытый ключ, может проверить подпись. В более распространенном стандарте X.509 подписанием открытых ключей занимаются централизованно управляемые центры сертификации. Вместо этого PGP использует распределенную парадигму, при которой отдельные пользователи подписывают открытые ключи друг друга. Это в некоторой степени сравнимо с одноранговым обменом файлами по сравнению с моделями клиент/сервер. Другие пользователи, получившие открытый ключ, могут знать, что ему можно доверять, если он подписан другими ключами, которые они уже знают и которым доверяют. Это может привести к довольно сложному процессу, поэтому многие пользователи PGP скажут вам, что наилучшей практикой является обмен ключами и их подпись на индивидуальной основе.
Ключи подписи
Предполагая, что Бобби уверен, что открытый ключ, который он импортировал, действительно принадлежит Алисе, он может подписать этот ключ своим собственным приватным ключом, используя опцию --sign-key
.
bobby:~$ gpg --sign-key alice@example.com
Вы можете заметить, что --list-keys
на выходе теперь отображается уровень доверия «full» к подписанному ключу. Вы также можете использовать --list-sig
опцию для просмотра всех подписей к ключу.
bobby:~$ gpg --list-sig alice@example.com
pub rsa3072 2022-12-01 [SC] [expires: 2024-11-30]
105B179F89F6BEEAB187EA882BC0AAE51BAFB0B3
uid [ full ] Alice
sig 3 2BC0AAE51BAFB0B3 2022-12-01 Alice
sig F30397D356C3E636 2022-12-05 Bobby
sub rsa3072 2022-12-01 [E] [expires: 2024-11-30]
sig 2BC0AAE51BAFB0B3 2022-12-01 Alice
sub dsa2048 2022-12-01 [S] [expires: 2024-11-30]
sig 2BC0AAE51BAFB0B3 2022-12-01 Alice
Теперь система Бобби знает, что ключ Алисы подписан и ему доверяют, но как насчет других? Чтобы это было полезно Алисе, Бобби должен затем экспортировать подписанный ключ Алисы и отправить его ей обратно. Затем она может импортировать его, используя ту же команду --import
выше, и подпись Бобби будет добавлена к ее ключу на ее собственной связке ключей; и теперь она будет включена, когда она экспортирует его для отправки другим. Все подписанные открытые ключи должны быть отправлены непосредственно обратно их владельцам, чтобы владелец мог собрать подписи для каждого из этих ключей.
Установка уровня доверия
Уровень доверия эффективно определяет, доверяете ли вы ключу. Это локальная настройка, хранящаяся в файле trustdb.gpg
и используемая для контроля вашего личного уровня доверия к ключам на вашей связке ключей. Это никак не влияет на общую валидность ключей, которая определяется подписями. Сам уровень доверия менее сложен, чем может показаться на первый взгляд. В конечном счете, ключи (и, следовательно, все, что зашифровано или подписано ими) либо являются надежными, либо нет. Уровень доверия влияет на то, как это определяется.
Уровень доверия | Описание |
---|---|
Ultimate | Этот уровень доверия устанавливает полное доверие независимо от пути доверия и используется только для ваших собственных ключей. Любое сообщение, подписанное с использованием этих ключей, является надежным. Любой ключ, подписанный этими ключами, также будет являться надежным. |
Full | Используется для ключей, которым вы полностью доверяете подписывать другие ключи. Например, если Бобби полностью доверяет ключу Алисы, и она использует его для подписи ключа Мэлори, ключу Мэлори также будут доверять. Полное доверие следует использовать только для ключей, которые были проверены и подписаны. Подписание ключа автоматически закрепляет за ним полное доверие. |
Marginal | Ключ с таким уровнем доверия считается действительным, если он подписан по крайней мере тремя другими ключами с предельным уровнем доверия. Этот параметр используется не часто из-за его сложности. |
Never | Этот уровень доверия используется для обозначения ключей, которым вы явно не доверяете по какой-либо причине. |
Unknown | Ключам с таким уровнем доверия нельзя доверять. Это уровень доверия по умолчанию, назначаемый неподписанным импортированным ключам до тех пор, пока они не будут подписаны или не будет настроен другой уровень доверия. |
Undefined | Фактически то же самое, что и Unknown, но настроено намеренно. Обычно используется в качестве заполнителя для ключей, которым позже может быть назначен уровень доверия. |
Revoked | Этот уровень доверия указывает на то, что ключ был отозван и ему больше не доверяют. |
Чтобы вручную настроить уровень доверия, используйте опцию --edit-key
для перехода в интерактивный режим, а оттуда используйте команду trust
. Затем вам будет предложено ввести число от 1 до 5, чтобы установить уровень доверия.
gpg> trust
pub rsa3072/2BC0AAE51BAFB0B3
created: 2022-12-01 expires: 2024-11-30 usage: SC
trust: marginal validity: full
sub rsa3072/B7A021383ADD3D0F
created: 2022-12-01 expires: 2024-11-30 usage: E
sub dsa2048/E1A00903B0E16687
created: 2022-12-01 expires: 2024-11-30 usage: S
[ full ] (1). Alice
Please decide how far you trust this user to correctly verify other users' keys
(by looking at passports, checking fingerprints from different sources, etc.)
1 = I don't know or won't say
2 = I do NOT trust
3 = I trust marginally
4 = I trust fully
5 = I trust ultimately
m = back to the main menu
Your decision? 1
Часть 4
Шифрование и подпись файлов
Как вручную зашифровать и подписать файлы с помощью GnuPG.
GnuPG обычно используется другими программами, такими как почтовые клиенты, которые автоматически используют ключи, содержащиеся в вашей связке ключей, для шифрования и подписи. Однако его также можно использовать для ручного шифрования, дешифрования, подписи и проверки файлов с помощью команд gpg
. Хотя вам, возможно, редко придется делать это на практике в реальном мире, это отличное упражнение для понимания того, как работает шифрование и подпись с открытым ключом.
Создание тестового файла
Нам понадобится файл для работы с этими примерами, поэтому мы просто создадим файл с именем testfile.txt
содержащий текст «This is a test».
$ echo "This is a test." > testfile.txt
Зашифровка файла
Чтобы зашифровать файл, вы должны использовать опцию --encrypt
, опцию --recipient
для указания получателя (т.е. открытого ключа для шифрования) и опцию --out
для указания выходного файла. Файл, подлежащий шифрованию, должен быть в конце, из-за чего полная команда поначалу может показаться немного запутанной.
bobby:~$ gpg --out encryptedfile.asc --encrypt --recipient alice@example.com --armor testfile.txt
Поскольку мы использовали опцию --armor
, мы можем просмотреть содержимое зашифрованного файла и увидеть зашифрованный текст.
$ cat encryptedfile.asc
-----BEGIN PGP MESSAGE-----
hQGMA1XbZzXhupAbAQv/RswYvraPE4/JdZrTNQCQ9LNKTDqEGPqozI+jEvndSLJf
Jv6/yjjBUQIEMNV80iyYCGiogJAidelJb5+tqg/sClkxtLehBQl/9wlMIlkOa/h4
PKr6ykkBQxmG5b1wzplxcr3M84tnZ2EcgntgoXaufyKo7OBNrwrJieBqBx1SBKE7
Bg73jq+MMOWAKcWUoCVjbzt/BJawNj09SQnFIO23ybMiDw/fclJloH9AAFUTrVct
IVhBIGqp8CszzSusqXdju5sbvH2aJqU9EcRDVZ1kZi60/bMbkY74guWbuxS6b59E
My0DYN++X/Z0FiDKxW/vvZyawATBhXlpIWpo3IEG/4SfCs13x3GtcSBbvMyZAM9E
aqY7Lt6Cp7ytmH/E5sRl+njbS+5wc01g+3PBwBQ/dARTTHpzQ1aEZaIDhO3ZcjGD
p8Xpqfpe9jM9utf/kfiXeWYZtvTMlmsaROJo01hrrPieue2Rgu+PqlFz4i6aJZ+W
bMJBNoko9pRRjzx0paS60lgBQrdzleVbT1JaL+XrAs/Qx8S50kw3e9i/jCPBeBoF
cMN/uq0nIClFQfV5xLIJ+O/OxCyFLYtJbgMv0XQpALCdJkhQTNzRz6eAEQlW5u/Q
CCT4vbJMhE1V
=Yj49
-----END PGP MESSAGE-----
Расшифровка файла
Получатель может расшифровать файл с помощью опции --decrypt
(при условии, что у него есть соответствующий приватный ключ).
alice:~$ gpg --out decryptedfile.txt --decrypt encryptedfile.asc
Подпись файла
В то время как шифрование файла обеспечивает конфиденциальность, подписание файла обеспечивает целостность, позволяя получателю убедиться, что файл действительно от предполагаемого отправителя; и не был изменен при передаче. В некотором смысле это функциональная противоположность шифрованию, поскольку для подписи используется приватный ключ отправителя и может быть проверен любым пользователем с открытым ключом.
Вы можете подписать файл, используя опции --sign
или --clearsign
. Опция --clearsign
похожа на --armor
в том смысле, что она создает подпись в виде обычного текста, а не в двоичном формате. Я буду использовать ее в этом примере для наглядности.
bobby:~$ gpg --clearsign testfile.txt
Если вы просмотрите содержимое подписанного файла, вы увидите исходное содержимое, а также подпись.
$ cat testfile.txt.asc
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
This is a test.
-----BEGIN PGP SIGNATURE-----
iHUEAREIAB0WIQT+Ql29bFIAmkx/4jr2NmhDPqcKLQUCY5TIOwAKCRD2NmhDPqcK
LcXkAP0ddy6ezclw0OAKErdRKm5pNv37GWtsyNU3E387sm6hqgD/f8yonnMYKpRb
7FfBz7CcbLaINZxyWosm3GYHqUUmqVQ=
=oDZU
-----END PGP SIGNATURE-----
Проверка подписанного файла
Получатель может проверить подпись на файле, используя опцию --verify
. Результирующий вывод сообщит вам, верна ли подпись.
alice:~$ gpg --verify testfile.txt.asc
gpg: Signature made Mon 05 Dec 2022 11:13:35 AM MST
gpg: using DSA key 197698E11D9E5B6787C4B55FE1A00903B0E16687
gpg: Good signature from "Bobby " [full]
Шифрование + Подпись
Конечно, вы можете и зашифровать, и подписать файл перед его отправкой, и обе функции могут быть выполнены одной командой. Это обеспечивает конфиденциальность и целостность и является стандартной практикой большинства систем шифрования с открытым ключом.
Для этого используйте опцию --sign
после опции --encrypt
.
bobby:~$ gpg --encrypt --sign --recipient alice@example.com --armor testfile.txt
Затем получатель может использовать --decrypt
для файла, и подпись будет проверена как часть расшифровки.
alice:~$ gpg --decrypt testfile.txt.gpg
gpg: encrypted with 3072-bit RSA key, ID B7A021383ADD3D0F, created 2022-12-01
"Alice <alice@example.com>"
This is a test.
gpg: Signature made Sun 11 Dec 2022 03:27:45 PM MST
gpg: using DSA key FE425DBD6C52009A4C7FE23AF63668433EA70A2D
gpg: Good signature from "Bobby <bobby@example.com>" [full]