使用 GPG-Agent 颠覆 HTTPS 密码缓存?
Subversion HTTPS password caching using GPG-Agent?
我在 Debian Stretch 机器上使用 Subversion 客户端(版本 1.9.5 r1770682,从默认包存储库安装),我只有 SSH 访问权限。我正在通过 HTTPS 连接到 Subversion 存储库,并且希望避免每次执行 svn up
或 svn 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 连接?)
如有任何帮助,我们将不胜感激。
这个帖子似乎给出了提示:https://groups.google.com/forum/#!topic/subversion_users/WS8Cr7mAovQ
我 运行 Xfce Ubuntu,我遇到了同样的问题。显然,原因是未设置 $GPG_AGENT_INFO
环境变量。手动 运行 /etc/X11/Xsession.d/90gpg-agent 脚本(设置此变量)确实帮助了我。
从上面 Roman 的建议开始,我通过再次调查终于找到了解决问题的方法。 Subversion客户端的GPG-Agent authentication source code中find_gpg_agent_socket
函数的注释确实说明了:
$GPG_AGENT_INFO
takes precedence, if set, otherwise $GNUPGHOME
will be used.
(...)
For reference GPG_AGENT_INFO
consists of 3 : separated fields. The path to the socket, the pid of the gpg-agent process and finally the version of the protocol the agent talks.
通过在命令行中调用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 正确保存
我在 Debian Stretch 机器上使用 Subversion 客户端(版本 1.9.5 r1770682,从默认包存储库安装),我只有 SSH 访问权限。我正在通过 HTTPS 连接到 Subversion 存储库,并且希望避免每次执行 svn up
或 svn 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 连接?)
如有任何帮助,我们将不胜感激。
这个帖子似乎给出了提示:https://groups.google.com/forum/#!topic/subversion_users/WS8Cr7mAovQ
我 运行 Xfce Ubuntu,我遇到了同样的问题。显然,原因是未设置 $GPG_AGENT_INFO
环境变量。手动 运行 /etc/X11/Xsession.d/90gpg-agent 脚本(设置此变量)确实帮助了我。
从上面 Roman 的建议开始,我通过再次调查终于找到了解决问题的方法。 Subversion客户端的GPG-Agent authentication source code中find_gpg_agent_socket
函数的注释确实说明了:
$GPG_AGENT_INFO
takes precedence, if set, otherwise$GNUPGHOME
will be used.(...)
For reference
GPG_AGENT_INFO
consists of 3 : separated fields. The path to the socket, the pid of the gpg-agent process and finally the version of the protocol the agent talks.
通过在命令行中调用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 正确保存