【问题标题】:Emacs + GPG + pinentry.el for authenticationEmacs + GPG + pinentry.el 用于身份验证
【发布时间】:2020-03-23 11:39:58
【问题描述】:

我很难为 Emacs 设置 pinentry 以使用身份验证(比如说 github)。使用 GPG 和 pinentry 对提交进行签名已经有效。我在 emacs 中使用 magit 进行版本控制,每次我提交一些 pinentry 都会在 minibuffer 中弹出,我输入我的密码并签署提交。都很好。

不过,我也使用 GPG 进行身份验证。我setup 和 GPG 的身份验证子密钥并设置 SSH 以使用它。如果我从 tty 执行此操作,它也可以。只是不是来自 Emacs 内部。这个问题与$GPG_TTY env var 有关。如果我尝试将某些内容推送到 GH,则不会弹出 minibuffer 中的 pinentry。相反,它等待并最终说我没有权限。

我应该提到我使用 emacs,更具体地说是 EXWM 作为我的窗口管理器。如果我退出 emacs,我会在我的 TTY 中看到 pinentry-encurses 对话框。如果我在按下时在 emacs 中打开了另一个终端,它将在该终端中打开 pinentry-ncurses 对话框,而不是在 minibuffer 中弹出 pinentry.el。

我这几天一直在谷歌上搜索并尝试不同的方法,但没有运气。

~/.gnupg/gpg-agent.conf:

allow-emacs-pinentry
allow-loopback-pinentry
default-cache-ttl 600
max-cache-ttl 7200
enable-ssh-support

~/.gnupg/gpg.conf:

use-agent

~/.bash_profile:

# GPG related
export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)
export GPG_TTY=$(tty)
#gpgconf --launch gpg-agent

我在 emacs 中的 pinentry 配置:

;; Enable loopback so that pinentry will pop up in emacs
(setq epa-pinentry-mode 'loopback)
(pinentry-start)

;; Update the TTY for gpg-agent
;(setenv "GPG_TTY" "/dev/pts/0")
(shell-command "gpgconf --launch-agent")
(shell-command "gpg-connect-agent updatestartuptty /bye >/dev/null")

我尝试在 emacs 中手动设置$GPG_TTY,正如您所见,没有运气。令我困惑的是,它仅适用于签署提交,但不适用于身份验证。

【问题讨论】:

  • 我在使用 spacemacs 时遇到了完全相同的问题。

标签: git authentication emacs gnupg


【解决方案1】:

我已经有一段时间没有问这个问题了。直到我停止玩这个游戏一段时间并在几周后回来之前,我才能找到答案。不幸的是,我无法说出为什么它一开始就不起作用。但是我发现了一个恰好对我有用的配置,自从我发现我没有触及任何文件以来,它就是:

要求:

  • Emacs 27+(我没有测试过旧版本)
  • pinentry-emacs。如果在您的包管理器中不可用,请从源代码构建它:
# Install deps (these also include emacs deps - sorry)
sudo apt update && sudo apt install -y git libgpg-error-dev libassuan-dev lbzip2 autoconf automake autotools-dev bsd-mailx build-essential diffstat gnutls-dev imagemagick libasound2-dev libc6-dev libdatrie-dev libdbus-1-dev libgconf2-dev libgif-dev libgnutls28-dev libgpm-dev libgtk2.0-dev libgtk-3-dev libice-dev libjpeg-dev liblockfile-dev liblqr-1-0 libm17n-dev libmagickwand-dev libncurses5-dev libncurses-dev libotf-dev libpng-dev librsvg2-dev libsm-dev libthai-dev libtiff5-dev libtiff-dev libtinfo-dev libtool  libx11-dev libxext-dev libxi-dev libxml2-dev libxmu-dev libxmuu-dev libxpm-dev libxrandr-dev libxt-dev libxtst-dev libxv-dev quilt sharutils texinfo xaw3dg xaw3dg-dev xorg-dev xutils-dev zlib1g-dev libjansson-dev libxaw7-dev libselinux1-dev libmagick++-dev libacl1-dev

# build pinentry-emacs
cd ~
wget https://gnupg.org/ftp/gcrypt/pinentry/pinentry-1.1.0.tar.bz2
tar -xf pinentry-1.1.0.tar.bz2
cd pinentry-1.1.0
./configure --enable-pinentry-emacs --enable-inside-emacs
make
sudo make install
cd ~
rm -rf pinentry-1.1.0 pinentry-1.1.0.tar.bz2

现在是配置文件:

# set this somwhere in your .bashrc / .zshrc / ...
export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)

~/.gnupg/gpg-agent.conf:

pinentry-program /usr/local/bin/pinentry-emacs # or we the path is
enable-ssh-support

~/.gnupg/sshcontrol:

<keygrip of your auth key>

使用gpg2 --list-secret-keys --keyid-format LONG --with-keygrip 获取按键。

现在是 emacs 本身。为 emacs 安装 pinentry。我使用厄运,所以我只需要做(package! pinentry)

应用以下配置:

;; Enable loopback so that pinentry will pop up in emacs
(pinentry-start)

;; Start GPG agent with SSH support
(shell-command "gpg-connect-agent /bye")

至少对我来说,在完成所有这些之后,emacs 中的 pinentry 可以同时用于签名和身份验证。

【讨论】:

    【解决方案2】:

    我有完全相同的症状,今天解决了。 GPG 签名从 magit 工作,但尝试推送失败。但是,我注意到 magit push 在 emacs 服务器重新启动后工作。问题是emacs服务器启动时没有定义环境变量SSH_AUTH_SOCK

    我认为问题在于 emacs 在定义 SSH_AUTH_SOCK 之前启动。就我而言,emacs 服务器已启动,并且 SSH 套接字变量是从 systemd 用户服务定义的。该问题已通过强制 emacs 服务器仅在设置变量后启动而得到解决。

    在您的情况下,这很可能是因为 emacs 作为 EXWM 的一部分很早就开始了。您可以通过M-x getenv 确认这一点并查找变量SSH_AUTH_SOCK。如果缺少变量,那么一个可能的解决方案是在 emacs 中定义环境变量:

    (setenv "SSH_AUTH_SOCK" (shell-command-to-string "gpgconf --list-dirs agent-ssh-socket"))
    

    但是,这一步必须延迟到 EXWM 完全启动之后,您可以合理地预期设置变量。也许它可以在 EXWM 加载结束时用一些钩子来执行。此外,这仅在 gpg 代理用作 ssh 代理时才有效。由于您使用的是 gpg 身份验证子密钥,因此这在您的情况下必须是正确的。

    【讨论】:

      猜你喜欢
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-19
      • 1970-01-01
      • 2021-04-15
      • 2015-08-12
      • 2022-01-20
      相关资源
      最近更新 更多