使用GPG-Agent颠覆HTTPS密码缓存?

时间:2018-01-22 20:49:08

标签: svn https gnupg gpg-agent

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

SVN Book表明我应该能够使用GPG-Agent作为缓存密码的方法。虽然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]

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

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

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

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

从上面罗曼的建议开始,我再次研究了这个问题,终于找到了解决方案。 Subversion客户端GPG-Agent authentication source codefind_gpg_agent_socket函数的注释确实可以解释:

  

$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才能正确保存。

答案 1 :(得分:1)

该线程似乎提供了一个提示:https://groups.google.com/forum/#!topic/subversion_users/WS8Cr7mAovQ

我在Ubuntu上运行Xfce,遇到了同样的问题。显然,原因是未设置$GPG_AGENT_INFO环境变量。手动运行/etc/X11/Xsession.d/90gpg-agent脚本(设置此变量)确实对我有所帮助。