Добавить второй подраздел к необработанному ключу GPG
Я пишу bash-скрипт, который генерирует необработанные ключи GPG, я просмотрел " Автоматическое использование GPG" и с удивлением обнаружил, что "в настоящее время может обрабатываться только один подраздел".
Я не могу найти, есть ли способ изменить ключ GPG, чтобы добавить второй подраздел, используя доступные функции автоматической генерации, или мне придется добавлять подраздел вручную.
Я пытался использовать here documents
, here strings
и создание файла с одним вводом на строку, а также с помощью printf
похож на ниже:
printf 'addkey' | gpg2 --edit-key 'test@test.com'
Ни одно из этих решений не работает:
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>
Мой файл ключей 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
ОБНОВЛЕНИЕ: 4 декабря 2016 г.
Я преодолел первое препятствие для получения некоторого ввода в GPG, используя следующий фрагмент:
~$ stty -echo; gpg2 --edit-key <keyname> "addkey"
Однако я не могу ввести "трубу" после запуска addkey
команда.
3 ответа
Сохраните для 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
Хитрость заключается в использовании--quick-add-key
,
Подраздел аутентификации может быть добавлен аналогичным образом. Мы получаем:
$ 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
Иметь gpg2
читайте ваши команды из stdin, используйте --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
Предполагая, что в вашей системе установлено ожидаемое значение и ${MY_KEY} и ${MY_PASSPHRASE} установлены правильно, вы можете начать с этого.
/usr/bin/expect <<EOF
set timeout 30
spawn gpg --command-fd=0 --status-fd=1 --pinentry-mode=loopback --edit-key ${MY_KEY}
expect {
timeout {send_user "\n!!! timeout !!!\n"; exit 127}
"Bad passphrase*" {exit 127}
"GET_LINE keyedit.prompt*" {send -- "addkey\r"; exp_continue}
"GET_LINE keygen.algo*" {send -- "4\r"; exp_continue}
"GET_LINE keygen.size*" {send -- "4096\r"; exp_continue}
"GET_LINE keygen.valid*" {send -- "0\r"; exp_continue}
"Is this correct?*" {send -- "y\r"; exp_continue}
"Really create?*" {send -- "y\r"; exp_continue}
"KEY_CREATED S*" {send -- "save\r"; exp_continue}
"GET_HIDDEN passphrase.enter*" {send -- "${MY_PASSPHRASE}\r"; exp_continue}
}
set returnvalues [wait]
set exitcode [lindex \$returnvalues 3]
exit \$exitcode
EOF