Простая цепочка доверия GPG

Вопрос или проблема

Я генерирую ключи gpg и пытаюсь создать цепочку доверия. В этом примере все происходит в одной директории. Но это не цель. Цепь доверия будет следующей:
Джон -> Джеймс -> Питер

#!/usr/bin/bash

rm -rf /dev/shm/*_gpg && export GNUPGHOME=$(mktemp -d -p /dev/shm --suffix _gpg) && chmod 0700 ${GNUPGHOME}

# Генерация JHON_KEY
cat > generation.conf << EOF
Key-Type: RSA
Key-Length: 1024
Key-Usage: cert
Name-Real: Джон jhon
Name-Email: [email protected]
Name-Comment: JHON_KEY
Expire-Date: 0
%no-protection
%commit
EOF

gpg -q --batch --generate-key ./generation.conf
echo ----------------------
gpg -q --armor --export JHON_KEY > jhon.pub.asc
gpg -q --armor --export-secret-keys JHON_KEY > jhon.priv.asc
gpg -q --armor --export-ownertrust > trust.db

rm -rf /dev/shm/*_gpg && export GNUPGHOME=$(mktemp -d -p /dev/shm --suffix _gpg) && chmod 0700 ${GNUPGHOME}

# Генерация JAMES_KEY
cat > generation.conf << EOF
Key-Type: RSA
Key-Length: 1024
Key-Usage: cert
Name-Real: Джеймс james
Name-Email: [email protected]
Name-Comment: JAMES_KEY
Expire-Date: 0
%no-protection
%commit
EOF

gpg -q --batch --generate-key ./generation.conf
gpg -q --armor --export JAMES_KEY > james.pub.asc
gpg -q --armor --export-secret-keys JAMES_KEY > james.priv.asc

# Генерация PETER_KEY
cat > generation.conf << EOF
Key-Type: RSA
Key-Length: 1024
Key-Usage: cert
Name-Real: Питер peter
Name-Email: [email protected]
Name-Comment: PETER_KEY
Expire-Date: 0
%no-protection
%commit
EOF

gpg -q --batch --generate-key ./generation.conf
# PETER_KEY подписан JAMES_KEY
gpg -q --batch --yes --default-key 'JAMES_KEY' --sign-key 'PETER_KEY'
gpg -q --export PETER_KEY > peter.pub.asc
gpg -q --export-secret-keys PETER_KEY > peter.priv.asc

rm -rf /dev/shm/*_gpg && export GNUPGHOME=$(mktemp -d -p /dev/shm --suffix _gpg) && chmod 0700 ${GNUPGHOME}
gpg -q --import jhon.priv.asc
gpg -q  --import-ownertrust trust.db
gpg -q --import james.priv.asc

# JAMES_KEY подписан JHON_KEY
gpg -q --batch --yes --default-key 'JHON_KEY' --sign-key 'JAMES_KEY'
gpg -q --armor --export JAMES_KEY > james.pub.asc
gpg -q --armor --export-secret-keys JAMES_KEY > james.priv.asc

rm -rf /dev/shm/*_gpg && export GNUPGHOME=$(mktemp -d -p /dev/shm --suffix _gpg) && chmod 0700 ${GNUPGHOME}
gpg -q  --import  jhon.pub.asc
gpg -q  --import-ownertrust trust.db
gpg -q  --import  james.pub.asc
gpg -q  --import  peter.pub.asc
gpg --check-trustdb
gpg --list-sigs
echo '********************************************************************************************'
cat trust.db

rm -rf /dev/shm/*_gpg

Вот мой вывод:

pub   rsa1024 2024-11-18 [C]
      597DE3BFFF6E80E3DB29D07440AB65B16AAB2377
uid           [ultimate] Джон jhon (JHON_KEY) <[email protected]>
sig 3        40AB65B16AAB2377 2024-11-18  [самоподпись]

pub   rsa1024 2024-11-18 [C]
      C3DBA67CD211C7457DDEBC30BEF1A819D331DB81
uid           [  полное  ] Джеймс james (JAMES_KEY) <[email protected]>
sig 3        BEF1A819D331DB81 2024-11-18  [самоподпись]
sig          40AB65B16AAB2377 2024-11-18  Джон jhon (JHON_KEY) <[email protected]>

pub   rsa1024 2024-11-18 [C]
      1EF8105B44C70350AC863D5C380FBC0B0688C646
uid           [  не определен ] Питер peter (PETER_KEY) <[email protected]>
sig 3        380FBC0B0688C646 2024-11-18  [самоподпись]
sig          BEF1A819D331DB81 2024-11-18  Джеймс james (JAMES_KEY) <[email protected]>

********************************************************************************************
# Список назначенных значений доверия, созданный Пн 18 Ноя 16:58:04 2024 CET
# (Используйте "gpg --import-ownertrust", чтобы восстановить их)
597DE3BFFF6E80E3DB29D07440AB65B16AAB2377:6:

Почему Питер имеет неопределенный уровень доверия? Он подписан Джеймсом! Как видно, Джеймс помечен как полностью доверенный только потому, что он подписан Джоном (Джеймс не находится в trustdb).

Спасибо.

Индикатор [ foo ] не показывает доверие к владельцу — он показывает действительность ключа. Эти понятия часто путают (иногда даже в документации GnuPG), но это не одно и то же:

  • действительность указывает на качество самого ключа, т.е. на то, получил ли он достаточно подписей от других доверенных ключей,

  • в то время как доверие указывает на то, может ли этот ключ — или точнее, владелец ключа — давать действительность другим ключам, подписывая их (это исходит из его собственной действительности плюс trustdb).

Ключ должен быть уже действительным, прежде чем ему можно будет доверять для проверки других — но это только одно из требований; действительный ключ не становится автоматически доверенным.

Таким образом, в этом случае [ полное ] означает, что ключ Джеймса действителен (т.е. WoT подтверждает, что ключ действительно принадлежит Джеймсу) после того, как он был подписан ключом с окончательным доверием, но в списке ничего не говорится о доверии, которое он имеет, чтобы давать действительность дальше (т.е. является ли это доверчивым Джеймсом или киберпанковским Джеймсом). Поэтому, даже несмотря на то, что ключ Питера подписан Джеймсом, эта подпись в данный момент не имеет веса в модели WoT.

(Другими словами, доверие угасает в модели WoT — оно не является бесконечно транзитивным, что означает, что вы можете безопасно подписывать ключ Джеймса, не рискуя тем, что они незнанием приведут к цепочке Джеймс→Питер→C→D→E→F→G…, где человек G оказывается тем, кто подписывает любой произвольный ключ, не проверяя ничего.)

Действительность ключа рассчитывается автоматически на основе подписей, которые он получил (и на доверии всех подписывающих), тогда как доверие не назначается самому ключу, а скорее владельцу ключа — отсюда “ownertrust” в командной строке gpg — и зависит от человеческого суждения, поэтому его нужно устанавливать вручную через trustdb.

Это обычно делается с помощью gpg --update-trustdb, который интерактивно спрашивает вас, доверяете ли вы владельцу каждого [полностью действительного] ключа для проверки других ключей. Если вы выберете “Я полностью доверяю Джеймсу”, то одной подписи от Джеймса будет достаточно, чтобы подтвердить ключ Питера, в то время как маргинальное доверие дает только 1/3 ‘действительности’ — т.е. три “маргинально доверенных” человека должны подписать ключ, чтобы он был действительным с вашей точки зрения.

Доверие к конкретным ключам также может быть изменено с помощью gpg --edit-key James trust. Вы можете, конечно, автоматизировать это через gpg --import-ownertrust, где 5 дает полное доверие, а 4 дает маргинальное доверие.

Дополнительно объяснено в:

Ответ или решение

Понимание Цепочки Доверия в GPG

При работе с системой шифрования GPG (GNU Privacy Guard), создание цепочки доверия становится важной частью управления ключами. В данном контексте имеет смысл разобрать ситуацию с ключами, созданными для пользователей по имени Джон, Джеймс и Питер, а также причины, по которым уровень доверия к ключу Питера остается неопределенным.

Основные Принципы Цепочки Доверия

Цепочка доверия в GPG отражает отношение между пользователями и их ключами. Здесь важны два понятия: действительность и доверие.

  1. Действительность (validity):

    • Это указывает на качество ключа и определяется, сколько других ключей (которые имеют доверие) подписали данный ключ. Если ключ имеет достаточное количество подписей от доверенных пользователей, он считается действительным.
  2. Доверие (trust):

    • Это субъективная оценка, присвоенная владельцам ключей. Доверие к владельцу ключа влияет на то, насколько его подписи будут восприниматься как надежные при подписывании других ключей. Доверие можно задавать вручную, и оно зависит от вашего личного мнения о данном пользователе.

Пример Цепочки Доверия: Джон → Джеймс → Питер

В данной ситуации:

  • Джон создает свой ключ и подписывает ключ Джеймса. Таким образом, Джеймс получает полное доверие (full trust) от Джона, что делает его ключ действительным.

  • Джеймс подписывает ключ Питера. Однако, поскольку ключ Джеймса не был назначен как доверенный в вашей базе данных, ключ Питера останется с неопределенным уровнем доверия ([undef]) независимо от того, что ключ Джеймса подписан Джоном.

Почему Ключ Питера Имеет Неподтвержденный Уровень Доверия?

На основании вашей конфигурации и объяснений можно сделать следующие выводы:

  1. Ключ Джеймса Действителен, Но Не Доверен: Несмотря на то, что ключ Джеймса имеет некоторую действительность после подписания им ключа Питера, это не дает автоматического доверия требования к ключу Питера. Доверие к Джеймсу необходимо задать вручную, чтобы его подпись имела вес.

  2. Необходимость Человеческого Вмешательства: Доверие к ключам должно быть установлено вручную через команду gpg --edit-key или через файл ownertrust. Например, вы можете указать, что доверяете Джеймсу полностью (gpg --import-ownertrust с соответствующими значениями).

  3. Изменение Долговечности Подписей: Следует понимать, что доверие не всегда обладает бесконечной транзитивностью. Даже если Джон доверяет Джеймсу, это не предполагает, что Джеймс обязан доверять любому, кого он подписывает.

Рекомендации

  1. Установка Доверия: Используйте команду gpg --edit-key James trust и выберите уровень доверия (например, «полное доверие»), чтобы авторизовать Джеймса подписывать другие ключи, такие как ключ Питера.

  2. Постоянное Обновление Базы Доверия: Регулярно используйте gpg --update-trustdb для обновления вашей базы данных доверия после внесения изменений.

  3. Понимание Разницы: Ясно осознавайте разницу между действительностью ключа и доверием к владельцу ключа, чтобы избегать путаницы, особенно при работе с цепочками доверия.

Заключение

Формирование цепочки доверия в GPG требует осознания механик работы системы и активного участия в управлении вашим доверием к другим пользователям. Понимание этих принципов не только поможет вам в создании надежного механизма шифрования, но и увеличит вашу уверенность в безопасности ваших данных.

Оцените материал
Добавить комментарий

Капча загружается...