28

Я могу использовать файл конфигурации ssh, чтобы включить пересылку ключей ssh, добавленных в ssh-agent. Как я могу сделать то же самое с ключами gpg?

5 ответов5

17

Новая Unix Domain Socket Forwarding от OpenSSH может делать это напрямую, начиная с версии 6.7.

Вы должны быть в состоянии что-то вроде:

ssh -R /home/bminton/.gnupg/S.gpg-agent:/home/bminton/.gnupg/S-gpg-agent -o "StreamLocalBindUnlink=yes" -l bminton 192.168.1.9
16

РЕДАКТИРОВАТЬ: Этот ответ устарел теперь, когда надлежащая поддержка была реализована в OpenSSH, см. Ответ Брайана Минтона.

SSH способен только пересылать TCP-соединения в туннеле.

Однако вы можете использовать такую программу, как socat для ретрансляции сокета unix через TCP с чем-то вроде этого (вам понадобится socat как на клиенте, так и на хостах сервера):

# 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) &

Проверьте, работает ли он с помощью gpg-connect-agent . Убедитесь, что GPG_AGENT_INFO на удаленном хосте не определен, чтобы он возвращался к $HOME/.gnupg/S.gpg-agent .

Теперь, надеюсь, все, что вам нужно, это способ запустить все это автоматически!

3

Мне пришлось сделать то же самое, и мой сценарий основывался на решении b0fh с несколькими крошечными модификациями: он перехватывает выходы и убивает фоновые процессы, а также использует параметры "fork" и "reuseaddr" для socat, что сохраняет вас цикл (и делает фоновый сокат чисто убиваемым).

Все это настраивает все форварды за один раз, так что это, вероятно, приближается к автоматической настройке.

Обратите внимание, что на удаленном хосте вам потребуется:

  1. Брелки, которые вы намереваетесь использовать для подписи /en /decrypt.
  2. В зависимости от версии gpg на пульте, поддельная переменная GPG_AGENT_INFO . Я ~/.gnupg/S.gpg-agent:1:1 - первый 1 - это PID для агента gpg (я имитирую его как "init", который всегда работает), второй - номер версии протокола агента. Это должно соответствовать тому, что работает на вашем локальном компьютере.

#!/bin/bash -e

FORWARD_PORT=${1:-12345}

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'

Я полагаю, что есть также решение, которое включает в себя только один вызов команды SSH (подключение обратно с удаленного хоста к локальному) с использованием -o LocalCommand , но я не мог понять, как удобно убить это при выходе.

2

В новых версиях дистрибутивов GnuPG или Linux пути сокетов могут меняться. Это можно узнать через

$ gpgconf --list-dirs agent-extra-socket

а также

$ gpgconf --list-dirs agent-socket

Затем добавьте эти пути к вашей конфигурации SSH:

Host remote
  RemoteForward <remote socket> <local socket>

Быстрое решение для копирования открытых ключей:

scp .gnupg/pubring.kbx remote:~/.gnupg/

На удаленном компьютере активируйте агент GPG:

echo use-agent >> ~/.gnupg/gpg.conf

На удаленном компьютере также измените конфигурацию сервера SSH и добавьте этот параметр (/etc/ssh/sshd_config):

StreamLocalBindUnlink yes

Перезапустите сервер SSH, переподключитесь к удаленному компьютеру - тогда он должен работать.

1

Согласно GnuPG Wiki, вы должны перенаправить удаленный сокет S.gpg-agent.extra в локальный сокет S.gpg-agent . Кроме того, вам нужно включить StreamLocalBindUnlink на сервере.
Имейте в виду, что вам также нужна открытая часть вашего ключа, доступная на удаленной GnuPG .

Используйте gpgconf --list-dir agent-socket соответственно gpgconf --list-dir agent-extra-socket на удаленном компьютере, чтобы получить фактические пути.


Резюме

  1. Добавленная конфигурация в удаленном /etc/sshd_config:

    StreamLocalBindUnlink yes
    
  2. Импортируйте ваш открытый ключ на удаленный компьютер:

    gpg --export <your-key> >/tmp/public
    scp /tmp/public <remote-host>:/tmp/public
    ssh <remote-host> gpg --import /tmp/public
    
  3. Команда для подключения через SSH с включенной переадресацией gpg-agent: (пути к моему Debian)

    ssh -R /run/user/1000/gnupg/S.gpg-agent:/run/user/1000/gnupg/S.gpg-agent.extra <remote-host>
    

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .