GPG-Agent und SSH Keys nutzen
Ich moechte meine GPG und SSH Keys nutzen, aber nicht dauernd die Passworte neu eingeben. Ich wuerde mich einloggen und bei der ersten Nutzung meiner Keys ein Passwort eingeben wollen und dann fuer die naechste Zeit (z.B. den Rest des Arbeitstages) nicht mehr gefragt werden wollen.
Der SSH-Agent leistet schon gute Arbeit (siehe elssh-agent) und es gibt auch Tools wie Keychain, aber ich koennte genau so gut meinen GPG Agent fuer alles nutzen. Der laeuft sowieso und kann mittlerweile auch SSH-Keys verwalten. Vorteil: er ist bei den meisten Systemen schon „onboard“ und laeuft bereits nach dem X-Login nutzbar im Hintergrund fuer alle Prozesse erreichbar.
Den Start des GPG-Agenten uebernimmt /etc/X11/Xsession.d/90gpg-agent
mit folgenden Zeilen:
    : ${GNUPGHOME=$HOME/.gnupg}
    GPGAGENT=/usr/bin/gpg-agent
    PID_FILE="$GNUPGHOME/gpg-agent-info-$(hostname)"
    if grep -qs '^[[:space:]]*use-agent' "$GNUPGHOME/gpg.conf" "$GNUPGHOME/options"
         && test -x $GPGAGENT &&
         { test -z "$GPG_AGENT_INFO" || ! $GPGAGENT 2>/dev/null; }; then
         if [ -r "$PID_FILE" ]; then
             . "$PID_FILE"
         fi
         # Invoking gpg-agent with no arguments exits successfully if the agent
         # is already running as pointed by $GPG_AGENT_INFO
         if ! $GPGAGENT 2>/dev/null; then
             $GPGAGENT --daemon --sh >"$PID_FILE"
             . "$PID_FILE"
         fi
    fi
… also brauche ich die Zeile 
    use-agent
in der Datei $HOME/.gnupg/gpg.conf oder $HOME/.gnupg/options, um den GPG-Agenten von X starten zu lassen.
Den Angaben von man gpg-agent folgend kann ich in der Datei $HOME/.gnupg/gpg-agent.conf dem GPG-Agenten einige Verhaltensweisen vorschreiben.
Fuer mich nuetzliche Konfiguraionsparameter in $HOME/.gnupg/gpg-agent.conf
    # PIN Eingabe UI
    pinentry-program /usr/bin/pinentry-qt
    # Maus und Keyboard nicht erfassen, sobald Pin Eingabe erscheint
    # um X-Sniffing zu vermeiden
    no-grab
    # SSH-Agent Support aktivieren
    enable-ssh-support
    # ENV Datei schreiben
    write-env-file ${HOME}/.gnupg/gpg-agent-info-${Hostname}
    # Gueltigkeit auf 8 Stunden setzen 8x60x60 (fuer GPG Keys und SSH Keys)
    default-cache-ttl     28800
    default-cache-ttl-ssh 28800
    # Lebensdauer auf 12 Stunden setzen 12x60x60 (fuer GPG Keys und SSH Keys)
    max-cache-ttl     43200
    max-cache-ttl-ssh 43200
    # fuer Signierung von Keys erneut nach Passwort fragen
    ignore-cache-for-signing
Nun kann ich nach erfolgreichem X-Login auf einer Konsole (oder Terminal 😉 )
den laufenden GPG-Agent ansprechen:
     heino@noirtom:~$ ps ax | grep gpg-agent
     3471 ?        Ss     0:00 /usr/bin/gpg-agent --daemon --sh
     4848 pts/1    R+     0:00 grep gpg-agent
     heino@noirtom:~$ # GPG-Agent laeuft also
     heino@noirtom:~$ gpg-connect-agent
     /help
     Available commands:
     /echo ARGS             Echo ARGS.
     /definqfile NAME FILE
          Use content of FILE for inquiries with NAME.
          NAME may be "*" to match any inquiry.
     /definqprog NAME PGM
          Run PGM for inquiries matching NAME and pass the
          entire line to it as arguments.
     /showdef               Print all definitions.
     /cleardef              Delete all definitions.
     /sendfd FILE MODE      Open FILE and pass descripor to server.
     /recvfd                Receive FD from server and print.
     /help                  Print this help.
     ....
     
     heino@noirtom:~$
Jetzt lade ich meinen Lieblings SSH Key in den vom GPG-Agent per Socket
vorgetaeuschten SSH-Agenten.
    heino@noirtom:~$ ssh-add -l
    The agent has no identities.
    heino@noirtom:~$ ssh-add .ssh/keys/heinoon_sshid
    Enter passphrase for .ssh/keys/heinoon_sshid:
    +--------------------------------------------------+
    | pinentry-XX                                      |
    | please enter passphrase ...                      |
    |        (siehe Foto Anhaenge)                     |
    |                                                  |
    | Passphrase: _____________________                |
    +--------------------------------------------------+
    Identity added: .ssh/keys/heinoon_sshid (.ssh/keys/heinoon_sshid)
    heino@noirtom:~$
Dabei gebe ich zuerst mein SSH-Key Passwort ein, wie bei einem normal
laufenden SSH-Agent. Dann oeffnet sich das konfigurierte PINENTRY-UI
und fragt nach einem Passwort, mit der der geheime SSH-Key im
„Schluesselkaestchen“ ($HOME/.gnupg/private-keys-v1.d/) des
GPG-Agenten gespeichert und verschluesselt werden soll. Dieses Passwort
ist frei waehlbar und es macht Sinn, nicht das Passwort des SSH-Keys zu
nehmen, sondern ein gleichwertig komplexes Passwort neu zu ersinnen. 😉
Der geheime SSH Key verschluesselt und gepseichert im Schluesselkasten vom GPG-Agent.
    heino@noirtom:~$ ls .gnupg/private-keys-v1.d/
    E78A62DB501143D11A82DBE5CA4DE81CA4B0B187.key
    heino@noirtom:~$ less .gnupg/private-keys-v1.d/<...>.key
    ".gnupg/private-keys-v1.d/<...>.key" may be a binary file.  See it anyway?
    (21:protected-private-key(3:dsa(1:p513: .....
    ......9:protected25:openpgp-s2k3-sha1-aes-cbc((4:sha18:....
    .......7:comment23:.ssh/keys/heinoon_sshid))
    heino@noirtom:~$
Fuer die komplette Laufzeit des GPG-Agenten und die Lebensdauer des SSH-Keys
liegt dieser Key fuer die Nutzung bereit …
    heino@noirtom:~$ ssh-add -l
    4096 f5:52:bd:4a:be:02:74:ed:27:b0:67:78:a5:d8:d2:59 .ssh/keys/heinoon_sshid (DSA)
    heino@noirtom:~$
Nach Ablauf der Gueltigkeit dieses SSH-Keys muss ich das neu ersinnte
Passwort (das zum Speichern im GPG-Agent Schluesselkasten) eingeben.
Die Gueltigkeit wird auch nach einem Neustart des Agenten oder des Systems
zurueckgesetzt. Mein eigentliches SSH-Key Passwort brauche ich erst wieder
nach Ablauf der Lebensdauer des Schluessels.
Die Gueltigkeit eiens SSH-Keys festlegen
    default-cache-ttl-ssh 28800 # 8 Stunden
Die Lebensdauer eines Keys bestimmt, wie lange er aus dem Schluesselkasten
des GPG-Agenten verwendet werden darf. Innerhalb der Lebensdauer brauche
ich zum Reaktivieren nur das Schluesselkasten-Passwort des Keys, erst
danach muss ich den SSH-Key wieder erneut hinzufuegen (mittels
ssh-add) und brauche das eigentliche SSH-Key Passwort.
Die Lebensdauer eines SSH-Keys festlegen
    max-cache-ttl-ssh 43200 # 12 Stunden
Sobald ich nun eine SSH Verbindung aufbaue und dabei mein SSH-Key benoetigt
wird, wird der GPG-Agent den SSH-Key aus dem Schluesselkasten laden, das
zugehoerige Schluesselkasten Passwort abfragen und den SSH-Key benutzen um mich
beim Verbindungsaufbau zu authentifizieren.
Fuer meine GPG-Keys gilt aehnliches, nur das dort die Keys nach Ablauf
der Lebensdauer nicht neu hinzugefuegt werden muessen. Sobald ich einen
GPG-Key benoetige (z.B. fuer Jabber, Mail, …), werde ich nach meinem
Passwort gefragt und aufgrund der Eintraege
    default-cache-ttl 28800 # 8 Stunden Gueltigkeit
und
    max-cache-ttl 43200     # 12 Stunden Lebensdauer
dann fuer mindestens 8 Stunden kein Passwort mehr eingeben
muessen. Spaetestens nach 12 Stunden jedoch ist der Key ungueltig und ich
muss erneut mein Passwort eingeben, aber das sollte dann doch zu schaffen
sein. 😉
Zum Schluss noch moechte ich meinen GPG-Agenten anweisen, das Passwort nicht fuer
Signier Aktionen zu nutzen. Das sollte jedesmal meine volle Aufmerksamkeit
fordern. Dazu die folgende Zeile in die Datei $HOME/.gnupg/gpg-agent.conf>
    ignore-cache-for-signing
Viel Spass mit dem GPG-Agent. Weiteres kommt …
