вкратце: Есть ли способ отключить функцию постоянного импорта gpg-agent
или обойти ее, чтобы разрешить использовать разные источники для ключей SSH?
Ситуация
я используюGnuPG 2 ключа(на YubiKey) для аутентификации SSH через gpg-agent
's enable-ssh-support
. Это работает отлично.
я должендругие ключидоступны (файловая система и KeePassXC). При использовании ssh-add
или KeePassXC для их добавления они импортируются gpg-agent
и сохраняются в ~/.gnupg/private-keys-v1.d/
. Мне нужно предоставить дополнительный пароль для их шифрования.
Проблема
Это работает так, как и заявлено, но сводит на нет смысл хранения ключей в другом месте:
- Я хочу, чтобы KeePassXCвременно добавить ключик текущему
ssh-agent
, когда он разблокирует базу паролей. Ключи не должны быть постоянно доступны после этого. - Аналогично для
ssh-add
файлов ключей из оболочки: я не хочу импортировать и сохранять их, предоставляя при этом еще больше паролей.
Как избежать импорта, при этом разрешив использовать все источники ключей? Одна из идей, которая у меня возникла, состояла в том, чтобы настроить несколько агентов на одной машине, возможно, gpg-agent
перенаправляя их на локальный ssh-agent
, но это звучит так, как будто это может быть слишком сложно.
Аналогичная проблема является частьюэта проблема KeePassXC, но решения предложено не было.
решение1
Третий вариант: вместо использования Yubikey через gpg-agent используйте его поддержку смарт-карт PIV через PKCS#11. Это изначально поддерживается OpenSSH через PKCS11Provider
:
ssh -I opensc-pkcs11.so root@myhost
ssh-agent также может быть осведомлен о ключах PKCS#11:
ssh-add -s opensc-pkcs11.so
(Yubico также предоставляет свой собственный libykcs11.so
модуль, специфичный для Yubikey, как часть yubico-piv-tool, но поскольку последний теперь устарел, я бы предположил, что libykcs11.so также устарел, и вам следует просто использовать общую поддержку PIV OpenSC. На практике эти два модуля взаимозаменяемы и будут распознавать объекты друг друга без каких-либо проблем.)
Обратите внимание, что апплеты OpenPGP и PIV от Yubikey полностью разделены, и вы не можете перемещать ключ между ними, поэтому, если это пара ключей, сгенерированная аппаратно, вам, к сожалению, придется создать новую с помощью ykman piv
. (Однако Yubikey позволяет импортировать ключи, сгенерированные программным обеспечением.)
Установите PIN-код (и PUK-код для разблокировки забытого PIN-кода). Оба должны быть буквенно-цифровыми и иметь длину 6–8 символов:
ykman piv change-pin -P 123456 ykman piv change-puk -p 12345678
Сгенерируйте ключ вместе с самоподписанным сертификатом (который не будет интересовать SSH):
ykman piv info ykman piv generate-key -a ECCP256 9a /tmp/9a.pub ykman piv generate-certificate 9a /tmp/9a.pub -s "Thomas" -d 3650 rm /tmp/9a.pub
Если у вас нет более новой версии
ykman
, вы можете использовать более старуюyubico-piv-tool
или даже различные универсальные инструменты PKCS#11 (например, OpenSCpkcs11-tool
или GnuTLSp11tool
):yubico-piv-tool -a change-pin -P 123456 yubico-piv-tool -a change-puk -P 12345678 yubico-piv-tool -a status yubico-piv-tool -a generate -A ECCP256 -s 9a -o /tmp/9a.pub yubico-piv-tool -a verify-pin -a selfsign-certificate \ -s 9a -S "/CN=Thomas" -i /tmp/9a.pub -o /tmp/9a.crt yubico-piv-tool -a import-certificate -s 9a -i /tmp/9a.crt
Экспортируйте открытый ключ в формате authorized_keys:
ssh-keygen -D opensc-pkcs11.so > Yubikey.pub
Используйте
ssh -I
опцию илиPKCS11Provider
настройку при подключении. (Вам будет предложено ввести PIN-код смарт-карты каждый раз — при необходимости настройте мультиплексирование SSH-подключения, чтобы сократить это количество.)
У этого подхода есть и другие преимущества: его очень легко использовать и в Windows, поскольку в Windows уже есть драйвер для смарт-карт PIV (например, через PuTTY-CAC или несколько других проектов, которые связывают хранилище ключей CAPI/CNG с клиентами SSH).