Назад | Перейти на главную страницу

GPG Я пытаюсь создать сценарий для автоматического связывания импортированного ключа ssh с первичным ключом

Я пытаюсь прикрепить импортированный ключ 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 + bash
  • это может создать проблему отладки, если произойдет ошибка

Так что, если у кого-то есть лучшее решение, мне все еще интересно.

Я подозреваю, что для этой операции недостаточно использовать отпечаток ключа, вместо этого вам понадобится рукоятка ключа из подключ который вы хотите импортировать.

Вот как бы я это сделал:

gpg --list-keys --with-keygrip AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

Найдите нужный подраздел и скопируйте Рукоятка ключа значение чуть ниже (40 шестнадцатеричных символов). Сравните это с вашим текущим значением. Должно быть что-то зависящее от контекста, вызывающее сбой автоматического выполнения, хотя я не могу точно определить причину прямо сейчас. Не думаю, что это связано с GPG Agent, но не уверен.

Ссылки:

Что такое «ключевой захват»?