【问题标题】:Subversion HTTPS password caching using GPG-Agent?使用 GPG-Agent 的 Subversion HTTPS 密码缓存?
【发布时间】:2018-07-01 13:57:49
【问题描述】:

我在 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 连接?)

任何帮助将不胜感激。

【问题讨论】:

    标签: svn https gnupg gpg-agent


    【解决方案1】:

    从上面 Roman 的建议开始,我终于通过再次研究找到了解决问题的方法。 Subversion客户端GPG-Agent authentication source codefind_gpg_agent_socket函数的cmets确实解释了:

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

    【讨论】:

    • 它对我有用,除了每天左右我必须再次输入密码。这个问题superuser.com/questions/1584409/… 提出了这个问题,但没有一个好的答案。
    • 在运行的服务器上升级操作系统后,GPG-Agent 中加密的 SVN 凭据的存储被破坏了,并且正在杀死我的一项 crontab 作业。这救了我!正如@AdamS 所指出的,在一个奇怪的对话框中再次提示我输入密码,但之后它可以正常工作。更新:这实际上并没有解决 crontab 问题,因为 GPG-Agent 将密码存储在内存中,而不是磁盘上。因此,一旦您退出会话,存储的密码将不再可用。
    【解决方案2】:

    这个帖子似乎给了一个提示:https://groups.google.com/forum/#!topic/subversion_users/WS8Cr7mAovQ

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

    【讨论】:

    • 感谢您的反馈!您的建议不能立即解决我的问题,因为我没有在我的机器上运行 X11 系统,但它(最终)帮助我找到了解决方案! (我会在下面添加。)
    猜你喜欢
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    • 2022-08-10
    • 1970-01-01
    • 2015-08-01
    • 2018-04-26
    相关资源
    最近更新 更多