어떻게 ssh-agent를 통해 gpg 키를 전달할 수 있습니까? 전달할 수 있습니다. gpg 키를 사용하여 동일한

ssh 구성 파일을 사용하여 ssh-agent에 ssh 키를 전달할 수 있습니다. gpg 키를 사용하여 동일한 작업을 수행하려면 어떻게해야합니까?



답변

편집 : OpenSSH에서 적절한 지원이 구현되었으므로이 답변은 사용되지 않습니다. Brian Minton의 답변을 참조하십시오.

SSH는 터널 내에서 tcp 연결 만 전달할 수 있습니다.

그러나 다음과 같은 프로그램을 사용할 수 있습니다. socat 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 소켓.

이제는 자동으로 실행하는 방법이 필요합니다.


답변

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

답변

나는 b0fh에 의해 b0fh에 의해 스크립트를 기반으로 스크립트를 작성해야만했습니다.이 스크립트는 exit를 트랩하고 백그라운드 프로세스를 종료하며 “fork”및 “reuseaddr”옵션을 사용하여 socat을 저장합니다. 루프 (그리고 배경 socat를 깨끗하게 죽일 수있게 만든다).

모든 것은 한 번에 모든 포워드를 설정하므로 자동화 된 설정에 더 가깝습니다.

원격 호스트에서 다음을 수행해야합니다.

  1. 당신이 서명 / en / 해독 물건에 사용하고자하는 열쇠 고리.
  2. 리모컨의 gpg 버전에 따라 위조 GPG_AGENT_INFO 변하기 쉬운. 내 채울거야. ~/.gnupg/S.gpg-agent:1:1 첫 번째 1은 gpg 에이전트의 PID입니다 (항상 “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, 그러나 나는 출구에서 그것을 편리하게 죽이는 방법을 알아낼 수 없었다.


답변

새로운 버전의 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 서버를 다시 시작하고 원격 컴퓨터에 다시 연결하면 작동합니다.


답변

에 따르면 GnuPG 위키 , 원격 소켓을 전달해야합니다. 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. gpg-agent 포워딩을 사용하여 SSH를 통해 연결하는 명령 : (내 데비안의 경로)

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