GPG 代理如何工作?

Sau*_*ode 37 gpg gpg-agent

我的 gpg.conf 文件中有一行写着use-agent.
我知道这是指 gpg-agent,它是一个守护进程。手册页指出“gpg-agent 是一个独立于任何协议管理秘密(私有)密钥的守护进程。它用作 gpg 和 gpgsm 以及其他一些实用程序的后端。”

任何人都可以在 gpg 的上下文中解释这意味着什么?gpg-agent 的意义何在?

我目前有 GPG 1.4。

  1. 如何判断代理是否正在运行?实际上,我什至不清楚 gpg-agent 是否与基本的 GPG 1.4 软件包一起安装。
  2. 如果它没有运行,我该如何启动它?
  3. 如果它正在运行,我该如何阻止它?

Gil*_*il' 45

Gpg-agent 是一个在后台运行的程序(守护进程)并将 GPG 密钥存储在内存中。当 GPG 进程需要密钥时,它会通过套接字联系正在运行的 gpg-agent 程序并请求密钥。如果代理进程有密钥,它会将它提供给 gpg。如果没有,它会尝试从您的密钥环加载加密密钥,并提示您输入密钥的密码。代理获得解密密钥后,将其传递给 gpg 进程。除了 GPG 密钥之外,Gpg-agent 还可以类似地存储 SSH 密钥并将它们提供给 SSH 进程,就像ssh-agentSSH 附带的程序一样。

使用密钥代理的主要目的是让您不必每次使用密钥时都输入密码。代理将密钥一次又一次地保存在内存中。GPG 本身不能这样做,因为一旦完成它的工作,进程就会终止。

密钥代理可以做的另一件事是允许在远程机器上运行的 GPG 获取本地代理中的密钥(这可能会从本地文件加载它们并提示您输入密码)。Gpg-agent 还不能做到这一点,这是一个计划中的功能。SSH 已经有代理转发很长时间了。(这是不将 gpg-agent 用于 SSH 密钥的原因。)

GPG 1.x 或 2.0.x 知道代理正在运行,因为GPG_AGENT_INFO设置了变量。此变量包含与代理通信的套接字的位置以及代理的进程 ID。GPG 2.1 总是将代理套接字放在~/.gnupg. 如果代理进程没有运行,GPG 2.x 总是会启动一个代理进程。

您只需运行gpg-agent. 如果您想将代理进程作为会话的一部分,您可以将会话管理器的调用替换为gpg-agent my-session-manager; 一些发行版会自动设置。GPG 会自动启动代理,GPG 2.1 会额外找到一个正在运行的代理,不需要环境变量,所以你不需要这样启动,除非你使用旧版本的 GPG 或者你使用代理来存储其他类型密钥,例如 SSH。

您可以使用shell 命令发送代理命令gpg-connect-agent。发送kill命令以终止代理进程(或向其发送信号)。

Gpg-agent 自带 GPG。一些发行版将其单独打包。

  • “当 GPG 进程需要密钥时,它会通过套接字联系正在运行的 gpg-agent 程序并请求密钥。如果代理进程拥有密钥,则将其提供给 gpg。” 有点误导。代理不提供客户端进程的密钥。相反,它代表客户端进程使用密钥执行操作。(客户端为代理提供签名、加密或解密的信息,代理会这样做。)使用代理时,您的 SSH 和 GPG 客户端软件永远无法访问实际密钥。 (11认同)
  • “gpg-agent 还不能这样做,这是一个计划中的功能。SSH 已经有代理转发很长时间了。(这是不使用 gpg-agent 获取 SSH 密钥的原因。)” 不完全正确。gpg-agent 适用于 SSH 代理转发。我每天都使用它。SSH 客户端处理转发,gpg-agent 并没有真正参与其中。不支持 GPG _itself_ 远程与代理交谈。 (4认同)
  • @nyg 它缓存私钥,这既更快(使用密码解密速度很慢)又更安全(以防用户在其他地方使用相同的密码)。 (2认同)