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

22

我正在使用 Subversion 客户端 (版本 1.9.5 r1770682,从默认软件包仓库安装) 在一个只允许 SSH 访问的 Debian Stretch 机器上。我通过 HTTPS 连接到一个 Subversion 存储库,并希望避免每次执行 svn upsvn ci 命令时都需要重新输入密码。我也希望避免将密码明文存储在磁盘上。

SVN Book 建议我应该能够使用 GPG-Agent 缓存我的密码。尽管 svn --version 报告 GPG-Agent 认证凭据缓存应该可用,但我在让它工作方面遇到了一些问题。

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

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

$ grep '^[^#]' < .subversion/config
[auth]
password-stores = gpg-agent
[helpers]
[tunnels]
[miscellany]
[auto-props]
[working-copy]

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

$ grep '^[^#]' < .subversion/servers
[groups]
[global]
store-passwords = yes
store-plaintext-passwords = no

然而,当我执行一个svn命令时,密码没有被缓存。有人有什么建议吗?我可能做错了什么?有人成功地使用GPG-Agent缓存HTTPS密码吗?(也许这个凭证缓存只用于SVN+SSH连接?)

任何帮助将不胜感激。

2个回答

33

通过再次查看Roman的建议,我终于找到了解决问题的方法。在Subversion客户端的GPG-Agent身份验证源代码中,find_gpg_agent_socket函数的注释确实解释了:

如果设置了$GPG_AGENT_INFO,则$GPG_AGENT_INFO优先使用;否则将使用$GNUPGHOME

(...)

作为参考,GPG_AGENT_INFO由3个用“:”分隔的字段组成。套接字路径、gpg-agent进程的pid以及代理所使用的协议版本。

可以通过在命令行上调用gpgconf --list-dirs agent-socket来轻松找到GPG-Agent套接字的路径。而$GPG_AGENT_INFO变量的另外两个段在Subversion客户端中不被使用,因此不一定需要设置。

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

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

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

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

rm -rf ~/.subversion/auth

开始一个新会话后,您应该能够验证$GPG_AGENT_INFO变量是否设置正确:echo $GPG_AGENT_INFO应该输出类似于/run/user/1000/gnupg/S.gpg-agent::(其中1000是当前用户的uid)。

执行Subversion命令(例如svn up)时,第一次将提示输入密码:

Updating '.':
Enter your Subversion password for <https://example.com:443> Subversion Repository
Password for 'username': :
At revision 123.

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

Updating '.':
At revision 123.

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


除了每天或者每隔一段时间需要重新输入密码之外,这个程序在我的电脑上能正常运行。有一个关于此问题的问答 https://superuser.com/questions/1584409/can-i-tell-the-gpg-agent-to-never-ask-me-for-a-password,但是没有一个好的答案。 - AdamS
在运行的服务器上升级操作系统后,GPG-Agent中加密的SVN凭据存储被清除,导致我的一个crontab作业失败。这个方法救了我!正如@AdamS所指出的那样,我又被提示输入密码,但是之后它可以无故障地工作。更新:实际上,这并不能解决crontab问题,因为GPG-Agent将密码存储在内存中,而不是磁盘上。因此,一旦您注销会话,存储的密码将不再可用。 - JDQ
1
从gpg-agent手册中,gpg-agent --daemon --enable-ssh-support --write-env-file "${HOME}/.gpg-agent-info",然后在~/.profile中,. "${HOME}/.gpg-agent-info}"并导出相关的环境变量。不需要使用gpgconf。https://linux.die.net/man/1/gpg-agent - silencej
2
这对我没用,但是这个有用。 - Gabriel Devillers

2

1
感谢您的反馈!您的建议并不是我问题的直接解决方案,因为我在我的机器上没有运行X11系统,但它(终于)帮助我找到了一个解决方案!(我将在下面添加它。) - ngj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接