首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Emacs + GPG + pinentry.el进行身份验证

Emacs + GPG + pinentry.el进行身份验证
EN

Stack Overflow用户
提问于 2020-03-23 19:39:58
回答 2查看 1.1K关注 0票数 3

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

不过,我也使用GPG进行身份验证。我使用GPG setup和身份验证子密钥,并设置SSH来使用它。如果我从tty中这样做,它也能正常工作。只是不是从Emacs内部。这个问题与$GPG_TTY环境变量有关。如果我尝试向GH推送一些东西,微型缓冲区中的pinentry不会弹出。相反,它会等待,最终会说我没有权限。

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

几天来,我一直在谷歌上搜索和尝试不同的方法,但都没有成功。

~/.gnupg/gpg-agent.conf:

代码语言:javascript
复制
allow-emacs-pinentry
allow-loopback-pinentry
default-cache-ttl 600
max-cache-ttl 7200
enable-ssh-support

~/.gnupg/gpg.conf:

代码语言:javascript
复制
use-agent

~/.bash_profile:

代码语言:javascript
复制
# GPG related
export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)
export GPG_TTY=$(tty)
#gpgconf --launch gpg-agent

我在emacs中的pinentry配置:

代码语言:javascript
复制
;; 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,正如您所看到的那样,没有成功。令我困惑的是,它只适用于签名提交,而不适用于身份验证。

EN

回答 2

Stack Overflow用户

发布于 2020-10-15 21:04:41

我已经有一段时间没有问这个问题了。我一直没有找到答案,直到我停下来玩了一段时间,几周后又回来了。不幸的是,我不能说为什么它一开始就不能工作。但我发现了一个恰好对我有效的配置,自从我发现我没有接触任何文件后,它就在那里:

要求:

  • Emacs 27+ (我还没有测试过旧版Emacs如果在包管理器中不可用,请从以下源代码进行构建:

代码语言:javascript
复制
# 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

现在,配置文件如下:

代码语言:javascript
复制
# set this somwhere in your .bashrc / .zshrc / ...
export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)

~/.gnupg/gpg-agent.conf

代码语言:javascript
复制
pinentry-program /usr/local/bin/pinentry-emacs # or we the path is
enable-ssh-support

~/.gnupg/sshcontrol

代码语言:javascript
复制
<keygrip of your auth key>

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

现在来看emacs本身。安装emacs的pinentry。我使用doom,所以我只需要做(package! pinentry)

应用以下配置:

代码语言:javascript
复制
;; 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既可以用于签名,也可以用于身份验证。

票数 5
EN

Stack Overflow用户

发布于 2021-03-16 14:12:04

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

我认为问题在于emacs在定义SSH_AUTH_SOCK之前就开始了。在我的示例中,emacs服务器已启动,并且从systemd用户服务定义了SSH套接字变量。已通过强制emacs服务器仅在设置变量后启动解决此问题。

在您的例子中,这很可能是因为emacs作为EXWM的一部分很早就开始了。您可以使用M-x getenv并查找变量SSH_AUTH_SOCK来确认这一点。如果缺少变量,则可能的解决方案是在emacs中定义环境变量:

代码语言:javascript
复制
(setenv "SSH_AUTH_SOCK" (shell-command-to-string "gpgconf --list-dirs agent-ssh-socket"))

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60812866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档