ssh 구성 파일을 사용하여 ssh-agent에 ssh 키를 전달할 수 있습니다. 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
소켓.
이제는 자동으로 실행하는 방법이 필요합니다.
localhost
지금.
gpg-connect-agent
: can't connect to server: ec=31.16383 gpg-connect-agent: error sending RESET command: Invalid value passed to IPC
. 원격 socat
그리고 나서 죽는다. 지역 socat
금형 및 절단기 socat[24692] E connect(3, AF=1 "", 2): Invalid argument
. 이 페이지 에이전트가 키 (단지 암호문)를 저장하지 않기 때문에 이것이 결코 작동하지 않을 것이라고 생각하게 만듭니다. 누구에게나 작동하는 것으로 확인 되었습니까?
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를 깨끗하게 죽일 수있게 만든다).
모든 것은 한 번에 모든 포워드를 설정하므로 자동화 된 설정에 더 가깝습니다.
원격 호스트에서 다음을 수행해야합니다.
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 서버를 다시 시작하고 원격 컴퓨터에 다시 연결하면 작동합니다.
systemctl --global mask --now gpg-agent.service gpg-agent.socket gpg-agent-ssh.socket gpg-agent-extra.socket gpg-agent-browser.socket
systemd가 원격 gpg-agent를 훔치는 소켓을 시작하지 못하게해야합니다. 에 따르면 bugs.debian.org/850982 이것은 의도 된 동작입니다.
에 따르면 GnuPG 위키 , 원격 소켓을 전달해야합니다. S.gpg-agent.extra
국부 소켓에 S.gpg-agent
.
또한 당신은 StreamLocalBindUnlink
서버에.
또한 리모컨에서 공개 키를 사용할 수 있어야합니다. GnuPG .
용도 gpgconf --list-dir agent-socket
각기 gpgconf --list-dir agent-extra-socket
실제 경로를 얻으려면 리모컨에서
리모컨에 추가 된 구성 /etc/sshd_config
:
StreamLocalBindUnlink yes
원격지에서 공개 키 가져 오기 :
gpg --export <your-key> >/tmp/public
scp /tmp/public <remote-host>:/tmp/public
ssh <remote-host> gpg --import /tmp/public
gpg-agent 포워딩을 사용하여 SSH를 통해 연결하는 명령 : (내 데비안의 경로)
ssh -R /run/user/1000/gnupg/S.gpg-agent:/run/user/1000/gnupg/S.gpg-agent.extra <remote-host>