没有x会话的gnome密钥用法


14

我的用例是,我有一台无头服务器,可以在该服务器上进行软件开发。我通常为与它的SSH连接启用X11转发,但是无法为连接较慢的遥远位置启用X11转发。
我需要安全的存储和git凭据缓存,因为我经常在树中使用18-20个存储库,因此我将git-credential-gnome-keyring用作git credential.helper,它使用libgnome-keyring进行通信到gnome-keyring-daemon。为了测试解决方案,我安装了一台带有监视器的PC,确认默认情况下该系统上的密钥环有效,然后使用SSH进行了尝试。它与X11转发一起使用,但没有它就无法工作。

在没有X11转发的情况下进行连接时,查询密钥环时会出现以下错误,并且该工具将退回到命令行提示符下:

** (process:18305): CRITICAL **: Error communicating with gnome-keyring-daemon

调查表明,基本问题是gnome-keyring-daemon期望连接使用dbus与之对话。如果没有X11会话,则dbus不会启动,因此,没有用于gnome-keyring-daemon和libgnome-keyring连接的通用dbus总线。

我找到了两个其他解决方案发布给该问题的解决方案,尽管它们都不适合我。

  1. 从使用X11的现有会话中获取DBUS端口
  2. 手动启动新的DBUS端口

连接到现有DBUS端口时,基本概念是查找现有登录会话的PID,从procfs中转储该PID的环境,在中搜索DBUS_SESSION_BUS_ADDRESS,然后在当前环境中将其导出。由于这是用于发布会话中所有对象正在使用的DBUS总线的变量,因此设置该值将允许会话中的所有对象在公共DBUS总线上进行通信,尽管它是与其他会话相关联的总线。
此处的来源:
https : //ubuntuforums.org/showthread.php

? t = 1059023 https://ask.fedoraproject.org/en/question/45246/error-communication-with-gnome-keyring-daemon-in-ssh-会话/

添加到我的.bashrc的代码在ssh登录时执行:

if [ -z "$DBUS_SESSION_BUS_ADDRESS" ] ; then
    local myPID=`pgrep "(.*session|fluxbox)" | head -n1`
    if [ -n "$myPID" ] ; then
        local myVar=`cat /proc/${myPID}/environ | grep -z "^DBUS_SESSION_BUS_ADDRESS=" | sed -e 's/DBUS_SESSION_BUS_ADDRESS=//'`
        if [ -n "$myVar" ] ; then
            export DBUS_SESSION_BUS_ADDRESS=$myVar
        fi
    fi
fi

第二种方法是手动为该会话启动DBUS,包括使用dbus-launch创建一个新会话并DBUS_SESSION_BUS_ADDRESS为环境设置,然后使用所有必需的服务启动gnome-keyring-daemon,这样它将看到我们创建的DBUS总线地址。而不是空的总线地址。此解决方案可能会或可能不需要更改gnome-keyring-daemon,以每个会话运行一个实例,而不是每个系统运行一个实例,但是目前尚不清楚。
来源:
从数字8开始:https://support.wandisco.com/index.php?/ Knowledgebase/ Article/ View/ 362/17/how-to-setup-encrypted-svn-password-storage-using-gnome- ssh会话中的keyring

如何在升级的情况下修改dbus服务的“ Exec”行而不丢失更改
添加到我的.bashrc的代码在ssh登录上执行:

# then DBUS wasn't started for this session and needs to be
if [ -z "$DBUS_SESSION_BUS_ADDRESS" ] ; then
    # start a new dbus session and make sure the variables are exported (automatic output)
    eval `dbus-launch --sh-syntax`

    # make sure gnome-keyring-daemon is using all the necessary components (it may not be by default)
    # Capture the output, which is a series of variable setting commands, one on eachline, and
    # export them while setting them
    while read -r LINE
    do
        export $LINE
    done <<< $(gnome-keyring-daemon --start --components=gpg,pkcs11,secrets,ssh)
fi

两种解决方案均给出相同的失败结果。进程挂起一会儿然后生成以下输出,而不是立即产生表明无法与gnome-keyring-daemon通信的错误:

Gkr-Message: secret service operation failed: Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection was broken.

** (process:31155): CRITICAL **: Error communicating with gnome-keyring-daemon

我不清楚gnome-keyring-daemon如何与DBUS交互,但是从第二组错误中可以清楚地看出,它不能通过新创建的DBUS总线或在不同DBUS总线上的交叉处理来访问。我发现的一些建议表明,gnome-keyring-daemon可能需要先启动DBUS,但尚不清楚用法(libgnome-keyring)还是守护程序。

我该如何工作?


确实,dbus会话需要在用户密钥环(守护程序)之前启动,而且当您使用x11转发时,您使用的是本地密钥环而不是远程密钥环...
intika

如第一种方法所示,我确实在启动keyring守护程序之前启动了dbus会话。而且您说的是,当我执行一个在远程系统上使用gnome-key-ring守护程序的命令时,它是通过$ DISPLAY套接字建立回到我的源系统的连接,从而在那里连接到dbus会话吗?这似乎极不可能,但我对它的了解还不足以完全不同意。Dbus不是图形工具,它是一种进程间通信工具,恰好被图形应用程序大量使用。
mtalexan

只是在这里吐痰,但您是否尝试过使用xvfb来“伪造” xsession。如果让它运行(并完成初始化)并导出DISPLAY var,以使dbus知道Xserver正在运行,则可能会起作用
TAAPSogeking

Answers:


1

这可能是一个愚蠢的答案……但是,gnome-keyring 需要访问X11会话,至少提示您输入主密钥。因此,通过设计使其无法运行是不是?

编辑:也许没有是不可能的。看到这篇文章,看起来类似于您的问题:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.