Das neue Unix Domain Socket Forwarding von OpenSSH kann dies ab Version 6.7 direkt tun.
Sie sollten etwas können wie:
ssh -R /home/bminton/.gnupg/S.gpg-agent:/home/bminton/.gnupg/S-gpg-agent -o "StreamLocalBindUnlink=yes" -l bminton 192.168.1.9
Ich kann die ssh-Konfigurationsdatei verwenden, um die Weiterleitung der zu ssh-agent hinzugefügten ssh-Schlüssel zu aktivieren. Wie kann ich dasselbe mit gpg-Schlüsseln machen?
Das neue Unix Domain Socket Forwarding von OpenSSH kann dies ab Version 6.7 direkt tun.
Sie sollten etwas können wie:
ssh -R /home/bminton/.gnupg/S.gpg-agent:/home/bminton/.gnupg/S-gpg-agent -o "StreamLocalBindUnlink=yes" -l bminton 192.168.1.9
BEARBEITEN: Diese Antwort ist veraltet, da in OpenSSH eine angemessene Unterstützung implementiert wurde, siehe Brian Mintons Antwort.
SSH kann nur TCP-Verbindungen innerhalb des Tunnels weiterleiten.
Sie können jedoch ein Programm verwenden, socat
um den Unix-Socket über TCP mit etwas anderem weiterzuleiten (Sie benötigen socat sowohl auf dem Client als auch auf den Serverhosts):
# Get the path of gpg-agent socket: GPG_SOCK=$(echo "$GPG_AGENT_INFO" | cut -d: -f1) # Forward some local tcp socket to the agent (while true; do socat TCP-LISTEN:12345,bind=127.0.0.1 UNIX-CONNECT:$GPG_SOCK; done) & # Connect to the remote host via ssh, forwarding the TCP port ssh -R12345:localhost:12345 host.example.com # (On the remote host) (while true; do socat UNIX-LISTEN:$HOME/.gnupg/S.gpg-agent,unlink-close,unlink-early TCP4:localhost:12345; done) &
Testen Sie, ob es mit klappt gpg-connect-agent
. Stellen Sie sicher, dass GPG_AGENT_INFO auf dem Remote-Host undefiniert ist, damit es wieder in den $HOME/.gnupg/S.gpg-agent
Socket fällt .
Jetzt ist es hoffentlich alles, was Sie brauchen, um dies alles automatisch auszuführen!
Ich musste dasselbe tun, und mein Skript basierte auf der Lösung von b0fh, mit ein paar winzigen Modifikationen: Es fängt Exits ab und beendet Hintergrundprozesse, und es verwendet die "Fork" - und "Reuseaddr" -Optionen zum Socat, was Ihnen das erspart Schleife (und macht den Hintergrund sauber tötbar).
Das Ganze macht alles auf einmal in einem Zug vor, so dass es wahrscheinlich einem automatisierten Setup näher kommt.
Beachten Sie, dass Sie auf dem Remote-Host Folgendes benötigen:
GPG_AGENT_INFO
Variable. Ich fülle meine mit ~/.gnupg/S.gpg-agent:1:1
- die erste 1 ist eine PID für den gpg-Agenten (ich fälsche es als "init" s, was immer läuft), die zweite ist die Versionsnummer des Agentenprotokolls. Dies sollte mit dem übereinstimmen, das auf Ihrem lokalen Computer ausgeführt wird. #!/bin/bash -e FORWARD_PORT=$ trap '[ -z "$LOCAL_SOCAT" ] || kill -TERM $LOCAL_SOCAT' EXIT GPG_SOCK=$(echo "$GPG_AGENT_INFO" | cut -d: -f1) if [ -z "$GPG_SOCK" ] ; then echo "No GPG agent configured - this won't work out." >&2 exit 1 fi socat TCP-LISTEN:$FORWARD_PORT,bind=127.0.0.1,reuseaddr,fork UNIX-CONNECT:$GPG_SOCK & LOCAL_SOCAT=$! ssh -R $FORWARD_PORT:127.0.0.1:$FORWARD_PORT socat 'UNIX-LISTEN:$HOME/.gnupg/S.gpg-agent,unlink-close,unlink-early,fork,reuseaddr TCP4:localhost:$FORWARD_PORT'
Ich glaube, es gibt auch eine Lösung, bei der nur ein SSH-Befehl aufgerufen wird (Verbindung vom Remote-Host zum lokalen) -o LocalCommand
, aber ich konnte nicht ganz herausfinden, wie ich das beim Beenden bequem beenden kann.
In neuen Versionen von GnuPG- oder Linux-Distributionen können sich die Pfade der Sockets ändern. Diese können über herausgefunden werden
$ gpgconf --list-dirs agent-extra-socket
und
$ gpgconf --list-dirs agent-socket
Fügen Sie dann diese Pfade zu Ihrer SSH-Konfiguration hinzu:
Host remote RemoteForward <remote socket> <local socket>
Schnelle Lösung zum Kopieren der öffentlichen Schlüssel:
scp .gnupg/pubring.kbx remote:~/.gnupg/
Aktivieren Sie auf dem Remote-Computer den GPG-Agenten:
echo use-agent >> ~/.gnupg/gpg.conf
Ändern Sie auf dem Remote-Computer auch die SSH-Serverkonfiguration und fügen Sie diesen Parameter hinzu (/ etc / ssh / sshd_config):
StreamLocalBindUnlink yes
Starten Sie den SSH-Server neu, stellen Sie die Verbindung zum Remote-Computer wieder her - dann sollte es funktionieren.
Laut GnuPG Wiki müssen Sie den Remote-Socket S.gpg-agent.extra
an den lokalen Socket weiterleiten S.gpg-agent
. Außerdem müssen Sie StreamLocalBindUnlink
auf dem Server aktivieren .
Beachten Sie, dass Sie auch den öffentlichen Teil Ihres Schlüssels benötigen, der auf der Remote- GnuPG verfügbar ist .
Verwenden Sie gpgconf --list-dir agent-socket
jeweils gpgconf --list-dir agent-extra-socket
auf der Fernbedienung, um die tatsächlichen Pfade abzurufen.
Hinzugefügte Konfiguration für Remote /etc/sshd_config
:
StreamLocalBindUnlink yes
Importieren Sie Ihren öffentlichen Schlüssel auf der Fernbedienung:
gpg --export <your-key> >/tmp/public scp /tmp/public <remote-host>:/tmp/public ssh <remote-host> gpg --import /tmp/public
Befehl zum Herstellen einer Verbindung über SSH mit aktivierter gpg-agent-Weiterleitung: (Pfade für mein Debian)
ssh -R /run/user/1000/gnupg/S.gpg-agent:/run/user/1000/gnupg/S.gpg-agent.extra <remote-host>