信息:
GPG version: 2.2.23
Docker version 20.10.5
我正在我的笔记本电脑上玩 GPG 并尝试在 docker 容器中重用它。
docker 容器只是一个 PHP-FPM alpine 镜像。我有简单的 PHP CLI 工具,可以使用 GPG 加密/解密数据。我从主机导出 GPG 并将其导入容器内。但问题是,我总是需要为 PHP 提供密码来解密数据。为了安全起见,我想避免在容器中使用密码。
此外,我发现了 gpg-agent
withgpg-preset-passphrase
并在容器内预配置了它,但后来发现这不是最佳选择,因为一旦我重新启动容器或销毁它,我将需要gpg-agent
再次启动并设置密码。
所以,我想知道,是否有一种方法可以gpg-agent
在 docker 内部传递缓存的密码,以便 docker 重用它来加密/解密数据?
我知道有可能在 docker 内重用 ssh-agent,但无法真正找到一种方法来为 GPG 做同样的事情。
或者也许有更好/安全的方法来做到这一点?
答案1
我想说这个决议非常简单。
GPG
首先,您需要开始gpg-agent
:
gpg-agent --verbose --daemon --log-file /tmp/gpg-agent.log --allow-preset-passphrase --default-cache-ttl=31536000
这将在后台启动 gpg-agent。您可以验证它是否正在运行:
ps aux | grep gpg
现在您需要使用gpg-preset-passphrase
私钥预设密码。gpg-preset-passphrase
不在 中/usr/local/bin
,因此您需要找到它:
sudo find / -name gpg-preset-passphrase
就我而言,它是/usr/local/Cellar/gnupg/2.3.1_1/libexec/gpg-preset-passphrase
,所以现在运行以下命令来找出私有 KEYID:
gpg-connect-agent 'keyinfo --list' /bye
示例输出:
S KEYINFO 4B86D9FBE0D9617C6EB4B42015C9B2AC8XXXXXXX D - - - P - - -
S KEYINFO 8960D3408E09A1A111AA862DBFB1B16CFXXXXXXX D - - - P - - -
OK
就我而言,它是两个密钥,选择其中一个密钥 ID。
echo "your-secret-passphrase" | /your/path/to/gpg-preset-passphrase --verbose --preset 4B86D9FBE0D9617C6EB4B42015C9B2AC8XXXXXXX
替换your-secret-passphrase
为您的密码、/your/path/to/
您的路径和4B86D9FBE0D9617C6EB4B42015C9B2AC8XXXXXXX
您自己的 KEYID。
现在再次运行以下命令以验证密码是否已成功设置:
gpg-connect-agent 'keyinfo --list' /bye
如果您在所选的 KEYID 附近看到“1”,则表示密码设置成功。
我们通过加密和解密来验证一下:
echo "hello" | gpg --armor --encrypt --recipient [email protected] | gpg --decrypt
替换[email protected]
为您的电子邮件。
通过 SSH 的 GPG 代理转发
将以下内容添加到您的~/.ssh/config
Host gpgtunnel
User user
HostName server-ip
Port 22
RemoteForward /root/.gnupg/S.gpg-agent /home/user/.gnupg/S.gpg-agent
IdentityFile ~/.ssh/id_rsa
RemoteForward
具有以下签名:<remote path> <local path>
.您可以通过运行以下命令找到本地路径的位置:
gpgconf --list-dir agent-extra-socket
ssh 到您的服务器并通过运行以下命令查找远程路径:
gpgconf --list-dir agent-socket
关于
S.gpg-agent
vs 的S.gpg-agent.extra
一些注意事项S.gpg-agent
允许导出私钥和使用密钥进行其他操作,这S.gpg-agent.extra
是一个非常有限的版本,仅允许加密/解密操作。
现在需要将公钥导出到远程服务器,可以使用以下命令:
gpg --export [email protected] | ssh -p 22 user@remote-server gpg --import
替换[email protected]
为您的 GPG 电子邮件。
确保您已成功导入公钥:
ssh -p 22 user@remote-server gpg -k
测试
现在尝试ssh gpgtunnel
在服务器上运行并进行加密/解密。现在服务器应该能够重用您的本地 gpg-agent 套接字。
echo "hello" | gpg --armor --encrypt --recipient [email protected] | gpg --decrypt
如果由于某种原因这不起作用,您可以从本地计算机运行以下 SSH 命令:
ssh -fNT gpgtunnel
这会将 SSH 置于后台(-f 标志)。现在ssh gpgtunnel
正常情况下,再次重试上面的加密/解密命令。