我正在尝试添加我的 GPG 公钥作为我们设备安装过程的一部分。它的目的是在管理员使用管理员门户将它们拉入他的本地之前加密任何重要的文件,如日志,然后使用私钥解密它们。计划是将公钥导出到文件中,并使用 gpg --import 命令进行设备安装过程来导入它。但我意识到,在进行任何加密之前,需要对密钥进行信任/签名。如何让这个密钥在安装时不受任何人为干预的信任?顺便说一句,我们的设备操作系统是 ubuntu vm,我们使用 kickstart 来自动化。
提前感谢所有帮助。
我正在尝试添加我的 GPG 公钥作为我们设备安装过程的一部分。它的目的是在管理员使用管理员门户将它们拉入他的本地之前加密任何重要的文件,如日志,然后使用私钥解密它们。计划是将公钥导出到文件中,并使用 gpg --import 命令进行设备安装过程来导入它。但我意识到,在进行任何加密之前,需要对密钥进行信任/签名。如何让这个密钥在安装时不受任何人为干预的信任?顺便说一句,我们的设备操作系统是 ubuntu vm,我们使用 kickstart 来自动化。
提前感谢所有帮助。
您的问题实际上是“我如何加密密钥而不让 gpg 拒绝密钥不受信任的事实?”
一个答案是您可以签署密钥。
gpg --edit-key YOUR_RECIPIENT
sign
yes
save
另一个是你可以告诉 gpg 继续并信任。
gpg --encrypt --recipient YOUR_RECIPIENT --trust-model always YOUR_FILE
巧合的是,我遇到了与 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
通过使用--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.
添加trusted-key 0x0123456789ABCDEF
到您的~/.gnupg/gpg.conf
替换keyid。这相当于最终信任此密钥,这意味着它所做的认证将被视为有效。仅将此密钥标记为有效而不信任它更难,并且需要签名或将信任模型切换为直接。如果您确定只导入有效密钥,您可以简单地通过添加将所有密钥标记为有效trust-model always
。在后一种情况下,请确保禁用自动密钥检索(默认情况下未启用)。
这对我有用:
尝试加密文件会这样响应:
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
现在加密工作正常。
基于@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 存储库之外的用户环境的解决方案。
这是我想出的用于自动化 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如何用于在同一操作中生成和导入密钥...此帮助脚本的第二版将更加清晰并且可以修改,但这是一个很好的起点。
我想,我想办法做到这一点。我使用“gpg --import-ownertrust”将我的信任数据库导出到一个文本文件中,然后从中删除了我的所有密钥,除了我需要推送的公钥。然后将我的公钥和编辑的所有者信任文件导入服务器。这似乎工作。现在我无法在 Kickstart 文件中执行这些步骤:-(
使用 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
这个 oneliner 使用来自 STDIN 的 ownertrust 值更新 trustdb——通过将指纹提取为--import-ownertrust
flag 所需的格式。
如 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
基于 Unix:
echo -e "5\ny\n" | gpg --homedir . --command-fd 0 --expert --edit-key user@exaple.com trust;
欲了解更多信息,请阅读这篇文章。如果您要创建多个密钥,它会详细说明。
有一种使用 --edit-key 自动信任密钥的方法,但无需进入交互式 shell(因此可以在脚本中自动化)。以下是 Windows 的示例:
(echo trust &echo 5 &echo y &echo quit) | gpg --command-fd 0 --edit-key your@email.com
信任导入的 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>
。第二行只提取指纹,如果你事先知道指纹,你可以放下它。
我使用以下脚本导入密钥:
#!/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
尝试这个 :
(echo trust &echo 5 &echo y &echo quit &echo save) | gpg --homedir 'gpgDirectory/' --batch --command-fd 0 --edit-key 'youKey'
--homedir : not required