我很难为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:
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,正如您所看到的那样,没有成功。令我困惑的是,它只适用于签名提交,而不适用于身份验证。
发布于 2020-10-15 21:04:41
我已经有一段时间没有问这个问题了。我一直没有找到答案,直到我停下来玩了一段时间,几周后又回来了。不幸的是,我不能说为什么它一开始就不能工作。但我发现了一个恰好对我有效的配置,自从我发现我没有接触任何文件后,它就在那里:
要求:
# 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。我使用doom,所以我只需要做(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既可以用于签名,也可以用于身份验证。
发布于 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中定义环境变量:
(setenv "SSH_AUTH_SOCK" (shell-command-to-string "gpgconf --list-dirs agent-ssh-socket"))但是,此步骤必须延迟到EXWM完全启动之后,此时您可以合理地设置变量。也许它可以在EXWM加载结束时使用一些钩子来执行。此外,只有将gpg代理用作ssh代理时,这才能起作用。由于您使用的是gpg验证子密钥,因此在您的情况下必须如此。
https://stackoverflow.com/questions/60812866
复制相似问题