认识
SSH Agent 是一个用于管理 SSH 密钥的程序,它可以帮助用户更安全、更方便地使用 SSH 协议进行认证。
SSH Agent 属于客户端程序,它是 SSH 客户端工具链的一部分,主要用于管理用户的私钥并提供身份认证服务。
SSH Agent 的设计初衷是为本地用户提供便捷的密钥管理,所有操作均在客户端完成,因此属于客户端程序。服务端仅负责验证客户端提供的认证信息,不直接与 Agent 交互。
SSH Agent 是 SSH 工具链中提高安全性和便利性的重要组件,合理使用可以显著改善 SSH 认证体验。
组成
WIP
构造
—— 构造的目的是获得该事物。要么借助现有实现,要么从零开始构建。针对我们的场景,我们选择前者。
- 大多数完整版 SSH 实现(如 OpenSSH)会提供原生 Agent。
- 精简版或嵌入式实现(如 Dropbear)通常不包含此功能。
- Windows/ 图形工具可能需要额外配置或使用替代方案。
常见实现
不是所有的 SSH 实现都默认提供 SSH Agent 程序,这取决于具体的实现和平台。以下是不同 SSH 实现对 SSH Agent 的支持情况:
- OpenSSH (Linux/macOS) | 默认包含 ssh-agent,是使用最广泛的实现
- LibreSSH | OpenSSH 的分支,兼容其功能
- Dropbear SSH | 轻量级实现,不包含 Agent 功能(但可通过第三方工具如 dropbearkey 补充)
- Bitvise SSH (Windows) | 商业实现,提供图形化的 Agent 管理
- PuTTY (Windows) | 部分支持 | 提供 Pageant 作为替代 Agent(功能类似但不完全兼容 OpenSSH Agent)
特殊情况
许多嵌入式设备的精简 SSH 实现(如 Dropbear)通常会移除 Agent 功能以节省资源。
Windows 10/11 的官方 OpenSSH 客户端(可选功能)包含 ssh-agent,但需要手动启用。
一些 GUI SSH 工具(如 SecureCRT、MobaXterm)会内置自己的 Agent 实现,而非使用系统原生 Agent。
替代方案
如果某个 SSH 实现不提供原生 Agent,可通过以下方式弥补:
使用 IdentitiesOnly 配置直接指定密钥路径,但需每次输入密码。
性质
SSH Agent 运行在用户本地机器(发起 SSH 连接的客户端),负责管理用户本地的私钥,与远程服务器无关。
SSH 服务端(sshd)完全不知道 Agent 的存在,它只接收来自 SSH 客户端的认证请求。客户端通过 Agent 获取私钥签名后,再将签名结果发送给服务端完成认证。
与服务端的关系
当用户通过 ssh -A 启用代理转发时,客户端的 Agent 会临时将签名能力传递给远程主机上的 SSH 客户端(用于跳板机场景),但 Agent 本身仍运行在原始客户端。
- 密钥管理:存储用户的私钥,避免每次使用都需要输入密码
- 身份验证:在 SSH 连接时自动提供正确的密钥
- 密钥缓存:将解密的私钥保存在内存中一段时间(直到代理关闭)
主要优点
– 单次解锁:只需在会话开始时输入一次密钥密码
– 密钥安全性:私钥始终保存在内存中,不会写入磁盘
– 转发支持:允许在可信环境中安全地转发认证能力
SSH Agent Forwarding
What is SSH Agent Forwarding and How Do You Use It? – CloudSavvy IT
通过 SSH Agent Forwarding 特性,在 Client-A 分发 Public-Key 到 Host-A、Host-B 后,当 Client-A 使用 Private-Key 登录到 Host-A 之后,此时 Client-A 能够从 Host-A 直接登录到 Host-B 主机,而无需在主机之间分发 Private-Key 信息。
这是因为 Host-A 连接 Host-B 主机时,Host-B 会询问 Host-A 的身份,而 Host-A 会将询问转发给 Client-A 的 SSH Agent 服务,由在 Client-A 的 SSH Agent 服务来响应 Host-B 的询问。
该笔记将记录:在 OpenSSH 中,如何配置使用 SSH Agent Forwarding 特性,以及相关问题的解决方案。
解决方案
在使用 SSH Agent Forwarding 特性前,需要在 Client-A 中进行以下检查:
1)SSH Agent 正在运行;
2)已经将 Private-Key 添加到 SSH Agent 中;
3)环境变量 SSH_AUTH_SOCK 正确定义,以确保 ssh(1) 能够连接到 SSH Agent 服务;
修改 Client-A 的 ~/.ssh/config 文件,添加如下配置:
Host * ForwardAgent yes
高级功能
- 代理转发:通过 `-A` 选项启用,允许远程服务器使用本地代理
“`bash
ssh -A user@remotehost
“`
- 时限设置:可以为添加的密钥设置过期时间
“`bash
ssh-add -t 3600 ~/.ssh/id_rsa # 密钥 1 小时后过期
“`
- 约束使用:限制密钥只能用于特定目的
“`bash
ssh-add -c ~/.ssh/id_rsa # 每次使用需要确认
“`
安全注意事项
– 只在可信机器上使用代理转发
– 会话结束后记得关闭代理(`ssh-agent -k`)
– 考虑使用 `-t` 选项为密钥设置合理的使用时限
– 在公共计算机上避免使用 SSH Agent
应用
启动 SSH Agent 服务
“`bash
eval “$(ssh-agent -s)”
“`
添加密钥
通过 ssh-add ~/.ssh/id_rsa 命令,来讲 SSH Private Key 添加到 SSH Agent 中。
Q:每次电脑重启之后,如果要连接多台服务器,我们需要手动执行 ssh-add 命令来添加密钥。我们希望能够实现 SSH Private Key 自动添加,而非手动添加。
R:https://superuser.com/questions/1595123/how-do-i-use-keepassxc-as-an-ssh-agent
A:现(03/26/2025)我们能够找打的解决方案有:
在.bashrc 中,添加 ssh-add 命令,来实现自动添加;- 针对桌面环境,使用 keepassxc 来管理密钥,其与 ssh-agent 集成,能够实现 SSH Private Key 自动添加;
列出已加载密钥
“`bash
ssh-add -l
“`
删除所有密钥
“`bash
ssh-add -D
“`
参考
DeepSeek / 介绍 SSH Agent
DeepSeek / SSH Agent 属于客户端程序还是服务端程序?
DeepSeek / 所有的 SSH 实现都提供 SSH Agent 程序吗?