git credentials

username

Nothing special needs to be done for git to remember the username for repository access, just include it in the clone URL:

git clone https://username@github.com/username/reponame.git

Or add it afterwards using git remote set-url <name> <newurl>, e.g.:

git remote set-url origin https://username@github.com/username/reponame.git

On-disk file storage (encrypted)

  • Download the git-credential-netrc

    helper script and put it somewhere in your $PATH. Note that the filename needs to be what git looks for, so e.g. remove the .perl extension. Make it executable.

  • make a ~/.netrc with the following format:

    machine a_server.corp.com
    login a_login
    password a_password
    protocol https
    
    machine a_server2.corp.com
    login a_login2
    password a_password2
    protocol https
    
  • create or import a gpg key that has a passphrase

  • encrypt the file with gpg -e -r a_recipient .netrc and then delete the plaintext ~/.netrc

  • tell git to use the encrypted file:

    git config --local credential.helper "netrc -f ~/.netrc.gpg -v"
    

Now the credential helper will decrypt the ~/.netrc.gpg file asking for the gpg key’s passphrase, and the gpg-agent should store the passphrase from then onwards (e.g. until reboot).

decrypt from the terminal

With modern versions of GPG (since 2.1), it will try to show a pinentry prompt by default. This might result in the following error:

Using GPG to open /home/graham/.netrc.gpg: [gpg --decrypt /home/graham/.netrc.gpg]
gpg: encrypted with 2048-bit RSA key, ID 786569FF6ED67CBA, created 2018-03-05
      "graham lopez <myaddr@email.com>"
gpg: public key decryption failed: Inappropriate ioctl for device
gpg: decryption failed: No secret key
No netrc entries found in /home/graham/.netrc.gpg

This occurs because the credential helper isn’t running through a TTY, so there’s no way to render the prompt. Fix this by telling gpg to use loopback pinentry mode. (Solution described here - add to ~/.gnupg/gpg.conf:

use-agent
pinentry-mode loopback

(NOTE: adding this to ~/.gnupg/gpg.conf could break other usage, so might want to edit the git-credential-netrc script to use gpg --decrypt --pinentry-mode loopback instead.) - add to ~/.gnupg/gpg-agent.conf:

allow-loopback-pinentry

and then restart the gpg-agent with echo RELOADAGENT | gpg-connect-agent

In-memory password caching

On almost all systems, git can cache the password in memory for some amount of time. This is stored either globally in $HOME/.gitconfig or per-repo in /path/to/repo-root/.gitconfig. The following would cache the password for 10 minutes:

[credential]
    helper = cache --timeout=600

This can be set via the command-line with git config [--global] credential.helper 'cache --timeout=600'

Keychain-based password caching

Ubuntu 17.10

Ubuntu with Gnome will have gnome-keyring already installed. Seahorse is also available via apt. So we just need to set up the credential helper for git to talk to gnome-keyring:

apt install libgnome-keyring-dev
cd /usr/share/doc/git/contrib/credential/gnome-keyring
make
chmod 755 git-credential-gnome-keyring
git config --global credential.helper /usr/share/doc/git/contrib/credential/gnome-keyring/git-credential-gnome-keyring

Gentoo (outside of Gnome)

We can use gnome-keyring as a git credential helper outside of Gnome as well. We’ll need X support compiled into dbus

USE=X emerge -av -oneshot dbus

now get the working pieces

emerge -av gnome-keyring libsecret seahorse

and finally set up git to use the credential helper

USE=gnome-keyring emerge -av dev-vcs/git git config --global credential.helper /usr/bin/git-credential-libsecret

make sure the keyring daemon starts with X, so add to ~/.xinitrc

eval $(/usr/bin/gnome-keyring-daemon --start --components=pkcs11,secrets,ssh)

Interacting with the keyring

To see what is in the keychain, use seahorse. Any of the keychains can also be unlocked here.

To unlock from the commandline, use secret-tool. It needs a an attribute/value pair to search on, so to see what these are, open up seahorse and look at the “details” tab of a given entry. For git, the entries typically have the following attributes: “server”, “user”, “protocol”. Server is e.g. “github.com” and protocol is typically “https”. So use secret-tool to unlock the keychain (and see the values) like:

secret-tool search --all --unlock protocol https

secret-tool can be used from the cli to store/retrieve arbitrary strings using arbitrary attribute/value pairs, but I haven’t found a way to add attributes to what the git-credential-libsecret utility automatically adds to the keyring.

I haven’t yet found a way to automatically prompt for unlock at login such as happens with display managers like gdm, lightdm, etc.

OSX keychain

See if the OSX keychain credential helper is already installed git credential-osxkeychain

If it isn’t, OSX may prompt you to install it as part of the Xcode commandline tools. Otherwise, it gets installed as part of the homebrew ‘git’ package.

Set git to use the OSX keychain git config --global credential.helper osxkeychain

use the /Applications/Utilities/Keychain Access.app to verify your password storage.