Вопрос или проблема
Сохранять учетные данные GnuPG в кэше на протяжении всей сессии пользователя
GnuPG может, с помощью gpg-agent
, кэшировать доступ к закрытому ключу. Как мне сохранить этот кэш активным на всю пользовательскую сессию?
Когда я разблокирую ключ для gpg-agent
, он остается в кэше только на ограниченное время. В случае с агентом SSH я ввожу пароль один раз, и он остается в кэше на всю сессию. Я хочу такого же поведения от gpg-agent
.
Таким образом, ssh-agent
не страдает от ограниченного времени кэширования. Но gpg-agent
ограничивает время кэширования, по крайней мере, по умолчанию. Как мне устранить ограничение по времени кэширования в gpg-agent
?
Пользовательская конфигурация (в ~/.gnupg/gpg-agent.conf
) может только определить значение по умолчанию и максимальную продолжительность кэширования; отключить это невозможно.
Опция default-cache-ttl
устанавливает тайм-аут (в секундах) после последней активности GnuPG (то есть он сбрасывается, если вы его используете), опция max-cache-ttl
устанавливает период времени (в секундах), в течение которого он сохраняет кэш после ввода вашего пароля. Значение по умолчанию составляет 600 секунд (10 минут) для default-cache-ttl
и 7200 секунд (2 часа) для max-cache-ttl
.
Установите его на год или около того – скажем, 34560000
секунд (400 дней) – и это должно сработать:
GnuPG 2.1 и выше
В GnuPG 2.1 и выше опция maximum-cache-ttl
была переименована в max-cache-ttl
без дополнительных изменений.
default-cache-ttl 34560000
max-cache-ttl 34560000
GnuPG 2 и ниже
default-cache-ttl 34560000
maximum-cache-ttl 34560000
Перезапустите агент
Но для того, чтобы это изменение вступило в силу, вам нужно завершить сессию, перезапустив gpg-agent.
gpgconf --kill gpg-agent
gpg-agent --daemon --use-standard-socket
Если вы хотите ограничить время кэширования до длительности вашей сессии, вам нужно будет убить демон при выходе. Это очень отличается в зависимости от операционной системы, поэтому я ссылаюсь на другой вопрос/ответ, содержащий подсказки для разных систем.
Вы также можете перезапустить gpg-agent
во время входа в систему, но это не ограничивает время кэширования до длительности сессии, а только до входов пользователя. Решите сами, является ли это проблемой в вашем случае.
Для Windows
Файл, который вам нужно отредактировать, должен находиться по адресу: ~\.gnupg\
Если вы выполните это в окне PowerShell, оно откроет: C:\Users\<UserName>\.gnupg
Просто поместите файл gpg-agent.conf
туда с любыми значениями, которые вам нравятся.
Вы можете проверить, сработало ли это, выполнив:
gpgconf.exe --reload gpg-agent
gpgconf.exe --list-options gpg-agent
Вы также можете использовать эту однострочную команду, чтобы установить тайм-аут на один день:
Set-Content -Path ~\.gnupg\gpg-agent.conf -Value "default-cache-ttl 86400$([System.Environment]::NewLine)max-cache-ttl 86400"
Старые версии GPG
В старых версиях файл находился по адресу:
$env:AppData\gnupg
(C:\Users\<UserName>\AppData\Roaming\gnupg
)
Поэтому, если вы не можете найти его по адресу ~\.gnupg\gpg-agent.conf
, посмотрите там.
Не забудьте перезагрузить ваш gpg-агент с помощью gpg-connect-agent reloadagent /bye
после изменения конфигурации.
Поскольку ваша проблема заключается в том, что вам нужно больше или неограниченное время кэширования для пароля, вы можете использовать gpg-preset-passphrase
для кэширования вашего пароля gpg, и у вас будет неограниченное время кэширования до тех пор, пока агент не будет перезапущен / перезагружен. Ознакомьтесь с документацией здесь:
gpg-preset-passphrase
:
Пароли, установленные с помощью этого утилиты, не истекают, если не используется опция
--forget
для явного их удаления из кэша — илиgpg-agent
не будет перезапущен или перезагружен (отправив ему SIGHUP). Обратите внимание, что максимальное время кэширования, установленное с помощью--max-cache-ttl
, все равно будет соблюдено.Необходимо разрешить эту настройку пароля, запустив
gpg-agent с--allow-preset-passphrase
.
Вот пример того, как кэшировать пароль с использованием утилиты gpg-preset-passphrase
в bash:
#!/bin/bash
GPG_PRESET_PASS="/usr/libexec/gpg-preset-passphrase"
KEY_GRIP=$(gpg --with-keygrip --list-secret-keys $KEY_ID | grep -Pom1 '^ *Keygrip += +\K.*')
read -s -p "[$script_name]: Введите пароль для кэширования в gpg-agent: " PASSPHRASE; echo $GPG_PRESET_PASS -c $KEY_GRIP <<< $PASSPHRASE
RETVAL=$?
if [ $RETVAL = 0 ]; then
echo "OK"
else
echo "NOT OK"
fi
нет шансов на debian 11
gpg-preset-passphrase: кэширование пароля не удалось: не поддерживается
bin $ cat /etc/os-release
PRETTY_NAME=”Debian GNU/Linux 11 (bullseye)”
NAME=”Debian GNU/Linux”
VERSION_ID=”11″
VERSION=”11 (bullseye)”
VERSION_CODENAME=bullseye
ID=debian
HOME_URL=”https://www.debian.org/”
SUPPORT_URL=”https://www.debian.org/support”
BUG_REPORT_URL=”https://bugs.debian.org/”
Ответ или решение
Для того чтобы сохранить кэш учетных данных GnuPG (gpg-agent) активным на протяжении всей сессии пользователя, необходимо изменить настройки кэширования в файле конфигурации gpg-agent. Вот пошаговая инструкция, как это сделать:
Шаг 1: Изменение конфигурации gpg-agent
-
Откройте файл конфигурации gpg-agent, который находится по адресу
~/.gnupg/gpg-agent.conf
. Если файл не существует, создайте его. -
Добавьте или измените следующие строки в файле:
Для GnuPG версии 2.1 и выше:
default-cache-ttl 34560000 max-cache-ttl 34560000
Для GnuPG версии 2 и ниже:
default-cache-ttl 34560000 maximum-cache-ttl 34560000
Значение
34560000
секунд соответствует 400 дням. Это позволит избежать истечения срока действия кэша, по крайней мере, в течение указанного периода.
Шаг 2: Перезапуск gpg-agent
После внесения изменений в конфигурацию вам необходимо перезапустить gpg-agent, чтобы новые настройки вступили в силу. Для этого выполните следующие команды:
gpgconf --kill gpg-agent
gpg-agent --daemon --use-standard-socket
Шаг 3: Автоматизация завершения работы gpg-agent
Если вы хотите, чтобы gpg-agent завершал свою работу при выходе из системы, вам потребуется настроить соответствующий сценарий, который будет убивать gpg-agent при выходе из сеанса. Это может отличаться в зависимости от вашей операционной системы. Полезные советы по этому вопросу можно найти здесь.
Альтернативные методы
Если вы часто обновляете или используете разные ключи, и вам нужны другие варианты управления временем кэширования, вы можете использовать утилиту gpg-preset-passphrase
. Это позволит кэшировать ваш пароль:
-
Убедитесь, что gpg-agent запускается с опцией
--allow-preset-passphrase
. -
Запустите
gpg-preset-passphrase
для вашего ключа, чтобы добавить пароль в кэш без ограничения по времени.Пример скрипта для кэширования пароля:
#!/bin/bash GPG_PRESET_PASS="/usr/libexec/gpg-preset-passphrase" KEY_GRIP=$(gpg --with-keygrip --list-secret-keys $KEY_ID | grep -Pom1 '^ *Keygrip += +\K.*') read -s -p "Введите пароль для кэширования в gpg-agent: " PASSPHRASE echo $GPG_PRESET_PASS -c $KEY_GRIP <<< $PASSPHRASE RETVAL=$? if [ $RETVAL = 0 ]; then echo "Пароль успешно закэширован" else echo "Ошибка при кэшировании пароля" fi
Обратите внимание, что на некоторых системах, таких как Debian 11, может возникнуть ошибка caching passphrase failed: not supported
. Убедитесь, что ваш gpg-agent поддерживает данную функцию.
Заключение
С помощью вышеописанных шагов вы можете настроить gpg-agent так, чтобы кэширование паролей происходило на протяжении всей сессии пользователя. Если у вас возникнут дополнительные вопросы или проблемы, не стесняйтесь обращаться за помощью.