136

GnuPG can, with gpg-agent, cache access to a private key. How can I keep that cache active for the entire user session?

When I unlock the key for gpg-agent, it only stays cached for a limited time. With SSH's agent, I enter the passphrase one time and it stays cached for the whole session. I want the same behaviour from gpg-agent.

So, ssh-agent doesn't suffer from a limited cache lifetime. But gpg-agent limits the cache lifetime, at least by default. How can I eliminate the limit on cache time from gpg-agent?

5 Answers 5

181

The user configuration (in ~/.gnupg/gpg-agent.conf) can only define the default and maximum caching duration; it can't be disabled.

The default-cache-ttl option sets the timeout (in seconds) after the last GnuPG activity (so it resets if you use it), the max-cache-ttl option set the timespan (in seconds) it caches after entering your password. The default value is 600 seconds (10 minutes) for default-cache-ttl and 7200 seconds (2 hours) for max-cache-ttl.

Set it to a year or so – say, 34560000 seconds (400 days) – and you should be fine:

GnuPG 2.1 and above

In GnuPG 2.1 and above, the maximum-cache-ttl option was renamed to max-cache-ttl without further changes.

default-cache-ttl 34560000
max-cache-ttl 34560000

GnuPG 2 and below

default-cache-ttl 34560000
maximum-cache-ttl 34560000

Restart the agent

But for this change to take effect, you need to end the session by restarting gpg-agent.

gpgconf --kill gpg-agent
gpg-agent --daemon --use-standard-socket

If you want to limit to your session length, you'd need to kill the daemon at logout. This is very different between operating systems, so I'm referring to another question/answer containing hints for different systems.

You could also restart the gpg-agent during login, but this does not limit caching time to the session length, but logins of a user. Decide yourself if this is a problem in your case.

14
  • 1
    Is this a “you can't do what you're asking” response? It's not clear, since you're talking about limiting the session length or limiting caching time. I want exactly the opposite of that: no arbitrary limit on the cache time or session length.
    – bignose
    Commented Jul 29, 2013 at 0:58
  • 2
    Please note that in latests versions (at least gnupg 2.1), the maximum-cache-ttl option doesn't exist. To see the correct options, see the official documentation: gnupg.org/documentation/manuals/gnupg/… Commented Dec 27, 2014 at 19:12
  • 5
    At least in GnuPG 2.1 the default for default-cache-ttl is 600 seconds (10 minutes), not two hours.
    – jlh
    Commented Oct 3, 2017 at 9:30
  • 2
    What can the reason be that my GPG4Win asks every 10 minutes even that my settings are set to the samples above? max-cache-ttl 34560000 Commented Dec 17, 2018 at 17:34
  • 1
    I think this should use "max-cache-ttl", since the "maximum-cache-ttl" option does not exists (in gnupg 2.1). I'd fix this as a typo, but I'm not sure if it maybe does exist in other versions? Commented Aug 30, 2020 at 18:33
39

For Windows

The file you need to edit should be placed at: ~\.gnupg\

If you run that in a PowerShell window it will open: C:\Users\<UserName>\.gnupg

Just put the gpg-agent.conf file there with whatever values you like.

You can verify it took by running:

  1. gpgconf.exe --reload gpg-agent
  2. gpgconf.exe --list-options gpg-agent

You can also use this one liner: Set-Content -Path ~\.gnupg\gpg-agent.conf -Value "default-cache-ttl 86400$([System.Environment]::NewLine)max-cache-ttl 86400"

Older Versions Of GPG

In older versions, the file was at: $env:AppData\gnupg (C:\Users\<UserName>\AppData\Roaming\gnupg)

So if you can't find it at ~\.gnupg\gpg-agent.conf look there.

4
  • If a second answer here isn't appropriate we can move this to it's own question, tagged with Windows. Not sure what's right :)
    – CubanX
    Commented Apr 23, 2019 at 14:12
  • Thanks and keep it here - good to have all info in one place. 👍
    – barfuin
    Commented Jun 13, 2019 at 16:57
  • 2
    Thanks very much. In my case, I had to move this file to it ~/.gnupg/gpg-agent.conf only then it worked. I didn't have GnuPG folder inside AppData, might help someone else. Commented Apr 17, 2020 at 21:44
  • 1
    For GnuPG 2.4.3 on Windows, I had to put gpg-agent.conf in my AppData\gnupg folder for it to work. Commented Jan 17 at 13:59
19

Make sure to reload your gpg agent with gpg-connect-agent reloadagent /bye after changing the config.

2
  • 1
    I'm not sure if this is a comment or answer. Weird that it got upvote. It's not related to what the OP is asking. OP wants to have longer cache time for passphrase.
    – MaXi32
    Commented Sep 16, 2020 at 15:39
  • 2
    It is more like a comment but I couldn't write those when I wrote this answer. Also no matter how you change your config, you need to reload the agent or nothing changes. Commented Sep 18, 2020 at 11:44
4

Since your problem is you need more or unlimited cache time for passphrase, then you can use gpg-preset-passphrase to cache your gpg password, and you will have unlimited cache time until the agent is restarted / reloaded. Read the documentation here:

gpg-preset-passphrase:

Passphrases set with this utility don’t expire unless the --forget option is used to explicitly clear them from the cache — or gpg-agent is either restarted or reloaded (by sending a SIGHUP to it). Note that the maximum cache time as set with --max-cache-ttl is still honored. It is necessary to allow this passphrase presetting by starting gpg-agent with the --allow-preset-passphrase.

Documentation

Example how to cache password using gpg-preset-passphrase utility in 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]: Enter passphrase to cache into gpg-agent: " PASSPHRASE; echo
$GPG_PRESET_PASS -c $KEY_GRIP <<< $PASSPHRASE
RETVAL=$?
if [ $RETVAL = 0 ]; then
    echo "OK"
else
    echo "NOT OK"
fi
1
  • grep (2.5.1-FreeBSD) on MacOS (darwin19.6.0) doesn't support -P/--perl-regexp but perl does: perl -lne 'print,$found++,exit if s/^ *Keygrip += +//; END {exit !defined $found}'
    – Kim Taylor
    Commented Dec 31, 2021 at 16:41
0

no chance on debian 11

gpg-preset-passphrase: caching passphrase failed: not supported

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/"

2
  • 1
    As it’s currently written, your answer is unclear. Please edit to add additional details that will help others understand how this addresses the question asked. You can find more information on how to write good answers in the help center.
    – Community Bot
    Commented May 3 at 10:31
  • This contribution seems to be not an answer to the question, and so should not be posted here. If you have a question of your own that you want someone to answer, please post a new question.
    – bignose
    Commented May 5 at 11:38

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .