我正在编写一个生成无人值守 GPG 密钥的 bash 脚本,我查看了 GPG 的无人值守用法,并惊讶地发现“目前只能处理一个子密钥”。
我无法找到是否有办法修改 GPG 密钥以使用可用的无人参与生成功能添加第二个子项,或者我是否必须自己手动添加子项。
我尝试使用here documents
,here strings
并创建一个每行一个输入的文件,并使用printf
类似于以下内容:
printf 'addkey' | gpg2 --edit-key 'test@test.com'
Run Code Online (Sandbox Code Playgroud)
这些解决方案都不起作用:
balthasar@magi:~$ printf 'addkey' | gpg2 --edit-key 'test3@test.com'
printf 'addkey' | gpg2 --edit-key 'test3@test.com'
gpg (GnuPG) 2.0.26; Copyright (C) 2013 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.
pub 4096R/AB96CED4 created: 2016-12-02 expires: 2017-09-02 usage: SC
trust: ultimate validity: ultimate
sub 2048R/71804CF2 created: 2016-12-02 expires: 2017-09-02 usage: E
[ultimate] (1). test3 <test3@test.com>
gpg>
Run Code Online (Sandbox Code Playgroud)
我的 GPG 密钥文件
Key-Type: RSA
Key-Length: 4096
Key-Usage: sign
Subkey-Type: RSA
Subkey-Length: 2048
Subkey-Usage: encrypt
Name-Real: Foo Bar
Name-Email: foobar@test.com
Expire-Date: 2017-09-02
%ask-passphrase
%commit
Run Code Online (Sandbox Code Playgroud)
更新:2016 年 12 月 4 日
通过使用以下代码段,我已经通过了向 GPG获取一些输入的第一个障碍:
~$ stty -echo; gpg2 --edit-key <keyname> "addkey"
Run Code Online (Sandbox Code Playgroud)
但是,我无法在运行addkey
命令后“管道”输入。
除了 2019 年,您可以在临时主目录中执行以下操作:
export GNUPGHOME=$(mktemp -d)
gpg --batch --passphrase '' \
--quick-generate-key "Firstname Lastname <lastname@example.com>" ed25519 cert 1y
FPR=$(gpg --list-options show-only-fpr-mbox --list-secret-keys | awk '{print $1}')
gpg --batch --passphrase '' \
--quick-add-key $FPR ed25519 sign 1y
gpg --batch --passphrase '' \
--quick-add-key $FPR cv25519 encrypt 1y
Run Code Online (Sandbox Code Playgroud)
可以类似地添加身份验证子密钥。我们得到:
$ gpg -K
/tmp/tmp.JSOrV6s0iL/pubring.kbx
-------------------------------
sec ed25519 2019-04-11 [C] [expires: 2020-04-10]
7E00D8318E2A2825F40981D00C6CA12AC7F293F3
uid [ultimate] Firstname Lastname <lastname@example.com>
ssb ed25519 2019-04-11 [S] [expires: 2020-04-10]
ssb cv25519 2019-04-11 [E] [expires: 2020-04-10]
$ gpg --version
gpg (GnuPG) 2.2.12
libgcrypt 1.8.4
Run Code Online (Sandbox Code Playgroud)
要从gpg2
标准输入读取您的命令,请使用--command-fd=0
. 要从gpg2
主密钥读取命令的位置读取主密钥的密码,请使用--pinentry-mode=loopback
. (gpg2 --help
未列出这些开关,但手册页中记录了它们。)使用这些开关,您可以gpg2
非交互式地进行通信。
我通过运行类似于以下命令的 bash 命令向现有主密钥添加了一个子密钥:
key=0123456789ABCDEF
passphrase="my passphrase"
{
echo addkey
echo 4 # RSA (sign only)
echo 4096 # key length
echo 0 # key does not expire
echo y # is this correct?
echo y # really create?
echo "$passphrase"
echo save
} | gpg2 --command-fd=0 --status-fd=1 --pinentry-mode=loopback --edit-key $key
Run Code Online (Sandbox Code Playgroud)