使用GPG-Agent的Subversion HTTPS密码缓存?

ngj*_*ngj 5 svn https gnupg gpg-agent

我在Debian Stretch机器上使用Subversion客户端(版本1.9.5 r1770682,从默认的软件包存储库安装),我只有SSH访问权限。我正在通过HTTPS连接到Subversion存储库,并希望避免每次执行svn upor svn ci命令时都必须重新输入密码。我还希望避免将密码以纯文本格式存储在磁盘上。

SVN书建议,我应该能够使用GPG代理作为缓存我的密码的手段。尽管有svn --version报道称GPG-Agent身份验证凭据缓存应该可用,但我还是无法正常工作。

关于GPG,我创建了一个GPG密钥对,将其添加export GPG_TTY=$(tty)到我的.profile文件中,并通过加密和解密一段文本来验证GPG可以工作。

关于Subversion,在我的.subversion/config文件中,设置了以下内容:

$ grep '^[^#]' < .subversion/config
[auth]
password-stores = gpg-agent
[helpers]
[tunnels]
[miscellany]
[auto-props]
[working-copy]
Run Code Online (Sandbox Code Playgroud)

在我的.subversion/servers文件中,设置了以下内容:

$ grep '^[^#]' < .subversion/servers
[groups]
[global]
store-passwords = yes
store-plaintext-passwords = no
Run Code Online (Sandbox Code Playgroud)

svn但是,当我执行命令时,不会缓存任何密码。有人对我可能做错了什么建议吗?是否有人成功使用GPG-Agent缓存HTTPS密码?(也许此凭据缓存仅用于SVN + SSH连接吗?)

任何帮助将不胜感激。

ngj*_*ngj 19

我终于找到了解决我的问题的方法,从上面罗曼的建议开始,再次研究它。find_gpg_agent_socketSubversion客户端的GPG-Agent认证源码中函数的注释确实说明了:

$GPG_AGENT_INFO优先,如果设置,否则$GNUPGHOME将被使用。

(……)

供参考GPG_AGENT_INFO由 3 :分隔的字段组成。套接字的路径,gpg-agent 进程的 pid,最后是代理对话的协议版本。

通过gpgconf --list-dirs agent-socket在命令行上调用可以轻松找到 GPG-Agent 套接字的路径。$GPG_AGENT_INFOSubversion 客户端不使用变量的其他两个部分,因此不必设置。

因此,我在.profile文件末尾添加了以下代码:

export GPG_TTY=$(tty)
export GPG_AGENT_INFO=`gpgconf --list-dirs agent-socket | tr -d '\n' && echo -n ::`
Run Code Online (Sandbox Code Playgroud)

这将$GPG_TTY变量设置为当前终端,将$GPG_AGENT_INFO变量设置为 GPG-Agent 套接字,后跟两个冒号字符(即 Subversion 源代码期望的格式)。

Subversion 似乎将存储库的身份验证设置缓存在~/.subversion/auth,因此我发现有必要在正确使用 GPG-Agent 之前清除该目录:

rm -rf ~/.subversion/auth
Run Code Online (Sandbox Code Playgroud)

启动新会话后,您应该能够验证$GPG_AGENT_INFO变量设置是否正确:echo $GPG_AGENT_INFO应该输出类似/run/user/1000/gnupg/S.gpg-agent::1000当前用户的 uid在哪里)的内容。

例如svn up,在执行 Subversion 命令时,第一次会提示您的密码:

Updating '.':
Enter your Subversion password for <https://example.com:443> Subversion Repository
Password for 'username': :
At revision 123.
Run Code Online (Sandbox Code Playgroud)

一段时间后,当对同一存储库执行第二个 Subversion 命令时,Subversion 应使用 GPG-Agent 缓存的密码:

Updating '.':
At revision 123.
Run Code Online (Sandbox Code Playgroud)

编辑:我的印象是,当一次使用存储库时(即,当它尚未出现在 Subversion 的缓存中时),只有在输入两次后,GPG-Agent 才能正确保存密码。

  • 这对我不起作用,但[这个](https://www.dhiller.de/2018/10/04/svn-gpg-agent.html)起作用了。 (3认同)