41

我正在尝试添加我的 GPG 公钥作为我们设备安装过程的一部分。它的目的是在管理员使用管理员门户将它们拉入他的本地之前加密任何重要的文件,如日志,然后使用私钥解密它们。计划是将公钥导出到文件中,并使用 gpg --import 命令进行设备安装过程来导入它。但我意识到,在进行任何加密之前,需要对密钥进行信任/签名。如何让这个密钥在安装时不受任何人为干预的信任?顺便说一句,我们的设备操作系统是 ubuntu vm,我们使用 kickstart 来自动化。

提前感谢所有帮助。

4

15 回答 15

33

您的问题实际上是“我如何加密密钥而不让 gpg 拒绝密钥不受信任的事实?”

一个答案是您可以签署密钥。

gpg --edit-key YOUR_RECIPIENT
sign
yes
save

另一个是你可以告诉 gpg 继续并信任。

gpg --encrypt --recipient YOUR_RECIPIENT --trust-model always YOUR_FILE
于 2013-06-16T06:01:29.470 回答
20

巧合的是,我遇到了与 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 <user@here.com>

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
于 2014-07-03T00:20:23.743 回答
13

通过使用--trust-model选项,有一种更简单的方法可以告诉 GPG 信任其所有密钥:

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

从手册页:

  --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.
于 2016-02-12T21:55:28.517 回答
10

添加trusted-key 0x0123456789ABCDEF到您的~/.gnupg/gpg.conf替换keyid。这相当于最终信任此密钥,这意味着它所做的认证将被视为有效。仅将此密钥标记为有效而不信任它更难,并且需要签名或将信任模型切换为直接。如果您确定只导入有效密钥,您可以简单地通过添加将所有密钥标记为有效trust-model always。在后一种情况下,请确保禁用自动密钥检索(默认情况下未启用)。

于 2014-06-12T19:17:08.703 回答
9

这对我有用:

尝试加密文件会这样响应:

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

现在加密工作正常。

于 2016-01-07T22:08:18.337 回答
6

基于@tersmitten 的文章和一些试验和错误,我最终得到了以下命令行来信任给定密钥环中的所有密钥,而无需用户交互。我将它用于与StackEschange Blackboxhiera-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 存储库之外的用户环境的解决方案。

于 2015-09-29T02:11:00.903 回答
3

这是我想出的用于自动化 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如何用于在同一操作中生成和导入密钥...此帮助脚本的第二版将更加清晰并且可以修改,但这是一个很好的起点。

于 2016-12-04T22:52:15.223 回答
2

我想,我想办法做到这一点。我使用“gpg --import-ownertrust”将我的信任数据库导出到一个文本文件中,然后从中删除了我的所有密钥,除了我需要推送的公钥。然后将我的公钥和编辑的所有者信任文件导入服务器。这似乎工作。现在我无法在 Kickstart 文件中执行这些步骤:-(

于 2012-10-29T23:24:41.830 回答
2

使用 powershell,以下是如何信任john.doe@foo.bar(改编自 @tersmitten 博客文章):

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

注意:使用cinst gpg4win-vanilla

于 2017-09-16T13:32:10.463 回答
2

这个 oneliner 使用来自 STDIN 的 ownertrust 值更新 trustdb——通过将指纹提取为--import-ownertrustflag 所需的格式。

如 gpg 手册页中所述,应使用此标志。如果 trustdb 严重损坏和/或如果您最近备份了 ownertrust 值,您可以重新创建 trustdb

gpg --list-keys --fingerprint \
    | grep ^pub -A 1 \
    | tail -1 \
    | tr -d ' ' \
    | awk 'BEGIN { FS = "\n" } ; { print $1":6:" }' \
    | gpg --import-ownertrust
于 2019-11-27T23:18:54.737 回答
2

基于 Unix:

echo -e "5\ny\n" |  gpg --homedir . --command-fd 0 --expert --edit-key user@exaple.com trust;

欲了解更多信息,请阅读这篇文章。如果您要创建多个密钥,它会详细说明。

于 2019-03-29T14:22:33.253 回答
2

有一种使用 --edit-key 自动信任密钥的方法,但无需进入交互式 shell(因此可以在脚本中自动化)。以下是 Windows 的示例:

(echo trust &echo 5 &echo y &echo quit) | gpg --command-fd 0 --edit-key your@email.com
于 2018-12-21T14:57:41.050 回答
2

信任导入的 gpg 密钥的一种方法:

gpg --import <user-id.keyfile>
fpr=`gpg --with-colons --fingerprint <user-id> |awk -F: '$1 == "fpr" {print$10; exit}'`
gpg --export-ownertrust && echo $fpr:6: |gpg --import-ownertrust

在这里,我假设您使用<user-id>from导入密钥<user-id.keyfile>。第二行只提取指纹,如果你事先知道指纹,你可以放下它。

于 2020-08-22T21:21:56.950 回答
0

我使用以下脚本导入密钥:

#!/bin/bash
function usage() {
cat >&2 <<EOF
    Usage: $0 path_of_private_key
    Example: gpg_import.sh ~/.ssh/my_gpg_private.key
    Import gpg key with trust.
EOF
exit 1
}

[[ $# -lt 1 ]] && usage
KEY_PATH=$1
    
KEY_ID=$(gpg --list-packets ${KEY_PATH}/${GPG_PRIVATE_KEY} | awk '/keyid:/{ print $2 }' | head -1)
       
gpg --import ${KEY_PATH}/${GPG_PRIVATE_KEY}
        
(echo trust &echo 5 &echo y &echo quit) | gpg --command-fd 0 --edit-key $KEY_ID
于 2021-12-27T12:05:00.520 回答
-2

尝试这个 :

(echo trust &echo 5 &echo y &echo quit &echo save) | gpg --homedir 'gpgDirectory/' --batch --command-fd 0 --edit-key 'youKey'

--homedir : not required
于 2020-05-13T15:26:24.433 回答