Как сделать автоматический ключ gpg доверия? - программирование

Как сделать автоматический ключ gpg доверия?

Я пытаюсь добавить свой публичный ключ GPG как часть процесса установки нашего устройства. Целью этого является шифрование любых важных файлов, таких как журналы, до того, как администратор потянет их в свой локальный, используя портал администратора, а затем расшифрует их с помощью закрытого ключа. План состоит в том, чтобы экспортировать открытый ключ в файл и сделать процесс установки устройства, чтобы импортировать его с помощью команды gpg --import. Но я понял, что ключ должен быть доверенным/подписанным перед любым шифрованием. Как сделать этот ключ надежным без вмешательства человека во время установки? Btw, наше устройство os - ubuntu vm, и мы используем kickstart для автоматизации.

Благодарим за помощь.

4b9b3361

Ответ 1

Ваш вопрос действительно "Как зашифровать ключ без gpg, запрещающего то, что ключ не доверен?"

Один ответ - вы можете подписать ключ.

gpg --edit-key YOUR_RECIPIENT
sign
yes
save

Другой, вы можете сказать gpg, чтобы идти вперед и доверять.

gpg --encrypt --recipient YOUR_RECIPIENT --trust-model always YOUR_FILE

Ответ 2

Кстати, у меня есть аналогичная ситуация с OP - я пытаюсь использовать общедоступные/закрытые ключи для подписи и шифрования прошивки для разных встроенных устройств. Поскольку ответ пока не показывает, как добавить доверие к ключу, который уже импортирован, вот мой ответ.

После создания и тестирования ключей на тестовом компьютере я экспортировал их как ascii:

$ gpg --export -a <hex_key_id> > public_key.asc
$ gpg --export-secret-keys -a <hex_key_id> > private_key.asc

Затем скопируйте и импортируйте их на сервер сборки:

$ gpg --import public_key.asc
$ gpg --import private_key.asc

Важно: добавить доверие

Теперь отредактируйте ключ, чтобы добавить окончательное доверие:

$ gpg --edit-key <[email protected]>

В командной строке gpg> введите trust, затем введите 5 для максимального доверия, затем y для подтверждения, затем quit.

Теперь протестируйте его с помощью тестового файла:

$ gpg --sign --encrypt --yes --batch --status-fd 1 --recipient "recipient" --output testfile.gpg testfile.txt

который сообщает

...
[GNUPG:] END_ENCRYPTION

без добавления доверия, я получаю различные ошибки (не ограничиваясь следующими):

gpg: There is no assurance this key belongs to the named user
gpg: testfile.bin: sign+encrypt failed: Unusable public key

Ответ 3

Добавьте trusted-key 0x0123456789ABCDEF в ваш ~/.gnupg/gpg.conf, заменив keyid. Это эквивалентно, в конечном счете, доверять этому ключу, что означает, что сделанные им сертификаты будут приняты как действительные. Просто отметить этот ключ как действительный, не доверяя ему, сложнее и требует либо подписи, либо переключения модели доверия для прямой. Если вы уверены, что только импортируете действительные ключи, вы можете просто пометить все ключи как действительные, добавив trust-model always. В последнем случае убедитесь, что вы отключили автоматическое извлечение ключа (не включены по умолчанию).

Ответ 4

Это сработало для меня:

Попытка шифрования файла отвечает следующим образом:

gpg -e --yes -r <uid> <filename>

It is NOT certain that the key belongs to the person named
in the user ID.  If you *really* know what you are doing,
you may answer the next question with yes.

Use this key anyway? (y/N)

That causes my shell script to fail.

Итак, я:

$gpg --edit-key <uid>

gpg> trust

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? 5
Do you really want to set this key to ultimate trust? (y/N) y

Please note that the shown key validity is not necessarily correct
unless you restart the program.

gpg> quit

Теперь шифрование работает правильно.

Ответ 5

Здесь уловка, которую я понял для автоматизации управления ключами GnuPG, подсказка heredoc + --command-fd 0 похожа на магию. Ниже приведена сокращенная версия одного из сценариев, которые были написаны для помощи в автоматизации с GnuPG.

#!/usr/bin/env bash
## First argument should be a file path or key id
Var_gnupg_import_key="${1}"
## Second argument should be an integer
Var_gnupg_import_key_trust="${2:-1}"
## Point to preferred default key server
Var_gnupg_key_server="${3:-hkp://keys.gnupg.net}"
Func_import_gnupg_key_edit_trust(){
    _gnupg_import_key="${1:-${Var_gnupg_import_key}}"
    gpg --no-tty --command-fd 0 --edit-key ${_gnupg_import_key} <<EOF
trust
${Var_gnupg_import_key_trust}
quit
EOF
}
Func_import_gnupg_key(){
    _gnupg_import_key="${1:-${Var_gnupg_import_key}}"
    if [ -f "${_gnupg_import_key}" ]; then
        echo "# ${0##*/} reports: importing key file [${_gnupg_import_key}]"
        gpg --no-tty --command-fd 0 --import ${_gnupg_import_key} <<EOF
trust
${Var_gnupg_import_key_trust}
quit
EOF
    else
        _grep_string='not found on keyserver'
        gpg --dry-run --batch --search-keys ${_gnupg_import_key} --keyserver ${Var_gnupg_key_server} | grep -qE "${_grep_string}"
        _exit_status=$?
        if [ "${_exit_status}" != "0" ]; then
            _key_fingerprint="$(gpg --no-tty --batch --dry-run --search-keys ${_gnupg_import_key} | awk '/key /{print $5}' | tail -n1)"
            _key_fingerprint="${_key_fingerprint//,/}"
            if [ "${#_key_fingerprint}" != "0" ]; then
                echo "# ${0##*/} reports: importing key [${_key_fingerprint}] from keyserver [${Var_gnupg_key_server}]"
                gpg --keyserver ${Var_gnupg_key_server} --recv-keys ${_key_fingerprint}
                Func_import_gnupg_key_edit_trust "${_gnupg_import_key}"
            else
                echo "# ${0##*/} reports: error no public key [${_gnupg_import_key}] as file or on key server [${Var_gnupg_key_server}]"
            fi
        else
            echo "# ${0##*/} reports: error no public key [${_gnupg_import_key}] as file or on key server [${Var_gnupg_key_server}]"
        fi
    fi
}
if [ "${#Var_gnupg_import_key}" != "0" ]; then
    Func_import_gnupg_key "${Var_gnupg_import_key}"
else
    echo "# ${0##*/} needs a key to import."
    exit 1
fi

Запустите с помощью script_name.sh 'path/to/key' '1' или script_name.sh 'key-id' '1' чтобы импортировать ключ и назначить значение доверия 1 или отредактировать все значения с помощью script_name.sh 'path/to/key' '1' 'hkp://preferred.key.server'

Шифрование теперь должно выполняться без жалоб, но даже если он использует следующий параметр --always-trust шифрование должно быть разрешено даже с жалобами.

gpg --no-tty --batch --always-trust -e some_file -r some_recipient -o some_file.gpg

Если вы хотите увидеть это в действии, то проверьте журналы сборки Travis-CI и то, как вспомогательный сценарий GnuPG_Gen_Key.sh используется для генерации и импорта ключей в одной и той же операции... вторая версия этого вспомогательного сценария будет намного чище и изменяемый, но это хорошая отправная точка.

Ответ 6

Думаю, я решил сделать это. Я использовал "gpg --import-ownertrust" для экспорта моего db доверия в текстовый файл, а затем удалил все мои ключи из него, кроме открытого ключа, который мне нужно было нажать. А затем импортировал мой открытый ключ и отредактировал файл доверия владельца на сервер. Это похоже на работу. Теперь мне не удается выполнить эти шаги в файле Kickstart: - (

Ответ 7

Основываясь на статье, посвященной @tersmitten, и немного проб и ошибок, я получил следующую командную строку, чтобы доверять всем ключам в заданном брелка без взаимодействия с пользователем. Я использую его для ключей, используемых с StackEschange Blackbox и hiera-eyaml-gpg:

# The "-E" makes this work with both GNU sed and OS X sed
gpg --list-keys --fingerprint --with-colons |
  sed -E -n -e 's/^fpr:::::::::([0-9A-F]+):$/\1:6:/p' |
  gpg --import-ownertrust

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

Ответ 8

Более простой способ сказать GPG доверять всем своим ключам с помощью опции -trust-model:

    gpg -a --encrypt -r <recipient key name> --trust-model always

На странице man:

  --trust-model pgp|classic|direct|always|auto

    Set what trust model GnuPG should follow. The models are:

      always Skip  key  validation  and assume that used 
             keys are always fully trusted. You generally 
             won't use this unless you are using some 
             external validation scheme. This option also 
             suppresses the "[uncertain]" tag printed 
             with signature checks when there is no evidence 
             that the user ID is bound to the key.  Note that 
             this trust model still does  not  allow  the use 
             of expired, revoked, or disabled keys.

Ответ 9

С powershell, вот как доверять [email protected] (адаптировано из сообщения @tersmitten blog):

(gpg --fingerprint [email protected] | out-string)  -match 'fingerprint = (.+)'
$fingerprint = $Matches[1] -replace '\s'
"${fingerprint}:6:" | gpg --import-ownertrust

Примечание: используя cinst gpg4win-vanilla

Ответ 10

echo "$( gpg --list-keys --fingerprint | grep "your-key-name-here" -B 1 | head -1 | tr -d '[:space:]'|awk 'BEGIN { FS = "=" } ; { print $2 }' ):6:" | gpg --import-ownertrust;

Этот однострочник вытащен из этой сути

Просто замените "your-key-name-here" на имя вашего ключа.

Ответ 11

Существует способ автоматически доверять ключу с помощью --edit-key, но без попадания в интерактивную оболочку (это можно автоматизировать в скрипте). Ниже приведен пример для окон:

(echo trust &echo 5 &echo y &echo quit) | gpg --command-fd 0 --edit-key [email protected]

Ответ 12

См. в этой статье Я недавно написал об этом. Два возможных решения:

  • Shell magic
  • Ожидать