Я пытаюсь прикрепить импортированный ключ ssh к существующему первичному ключу. Импортированный ключ ssh существует внутри ~ / .gnupg / private-keys-v1.d / и может использоваться через gpg-agent. Когда я вручную связываю его с первичным ключом, он работает отлично. Я ищу способ автоматизировать процесс с помощью сценария bash.
В этом примере:
Ручное исполнение (работает):
bob@computer:~$ gpg --expert --edit-key AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
gpg (GnuPG) 2.2.12; Copyright (C) 2018 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.
sec rsa2048/AAAAAAAAAAAAAAAA
created: 2020-04-01 expires: never usage: SCEA
trust: ultimate validity: ultimate
[ultimate] (1). My name <bob@server.com>
gpg> addkey
Please select what kind of key you want:
(3) DSA (sign only)
(4) RSA (sign only)
(5) Elgamal (encrypt only)
(6) RSA (encrypt only)
(7) DSA (set your own capabilities)
(8) RSA (set your own capabilities)
(10) ECC (sign only)
(11) ECC (set your own capabilities)
(12) ECC (encrypt only)
(13) Existing key
Your selection? 13
Enter the keygrip: BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions: Sign Encrypt
(S) Toggle the sign capability
(E) Toggle the encrypt capability
(A) Toggle the authenticate capability
(Q) Finished
Your selection? s
Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions: Encrypt
(S) Toggle the sign capability
(E) Toggle the encrypt capability
(A) Toggle the authenticate capability
(Q) Finished
Your selection? e
Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions:
(S) Toggle the sign capability
(E) Toggle the encrypt capability
(A) Toggle the authenticate capability
(Q) Finished
Your selection? a
Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions: Authenticate
(S) Toggle the sign capability
(E) Toggle the encrypt capability
(A) Toggle the authenticate capability
(Q) Finished
Your selection? q
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0) 0
Key does not expire at all
Is this correct? (y/N) y
Really create? (y/N) y
sec rsa2048/AAAAAAAAAAAAAAAA
created: 2020-04-01 expires: never usage: SCEA
trust: ultimate validity: ultimate
ssb rsa4096/8022F3DA9BFC5AC3
created: 2020-04-01 expires: never usage: A
[ultimate] (1). My name <bob@server.com>
gpg> save
bob@computer:~$
Мы видим, что подключ успешно связан с первичным ключом. Это тот, у которого есть отпечаток 8022F3DA9BFC5AC3.
Теперь я покажу вам два способа, которыми я пытался сделать это автоматически с помощью сценария bash.
Сначала я попробовал с аргументом --command-fd (не работает):
{
echo addkey
echo 13 # Existing key
echo BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
echo
echo S #
echo E #
echo A #
echo Q #
echo 0 # key does not expire
echo save
} | gpg --expert --command-fd=0 --status-fd=1 --pinentry-mode=loopback --edit-key AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Затем я попробовал с аргументом --command-file (не работает):
cat > /tmp/cmd << EOF
addkey
13
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
S
E
A
Q
0
save
EOF
gpg --expert --command-file=/tmp/cmd --status-fd=1 --pinentry-mode=loopback --edit-key AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Ни один из этих двух методов не работает. Приглашение «Enter the keygrip:» появляется всегда. Я действительно хочу избежать взаимодействия с пользователем в этом процессе. Я пробовал много перенаправлений потока, таких как конвейер (с командой yes), Here Documents, Here Strings, подстановка процессов и т. Д. Ничего не работает, чтобы ввести клавиатуру без вмешательства человека.
Спасибо коллеге, который предложил мне следующее решение с использованием ожидать инструмент:
expect << EOF
spawn bash -c "{ echo addkey; echo 13; echo S; echo E; echo A; echo Q; echo 0; echo save; } | gpg --expert --command-fd=0 --status-fd=1 --pinentry-mode=loopback --edit-key AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
expect "Enter the keygrip: " { send "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\r" }
expect eof
EOF
Даже если это решение работает, я не полностью удовлетворен им по следующим причинам:
Так что, если у кого-то есть лучшее решение, мне все еще интересно.
Я подозреваю, что для этой операции недостаточно использовать отпечаток ключа, вместо этого вам понадобится рукоятка ключа из подключ который вы хотите импортировать.
Вот как бы я это сделал:
gpg --list-keys --with-keygrip AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Найдите нужный подраздел и скопируйте Рукоятка ключа значение чуть ниже (40 шестнадцатеричных символов). Сравните это с вашим текущим значением. Должно быть что-то зависящее от контекста, вызывающее сбой автоматического выполнения, хотя я не могу точно определить причину прямо сейчас. Не думаю, что это связано с GPG Agent, но не уверен.
Ссылки: