公钥认证与代理转发
了解 authorized_keys、Ed25519 与 RSA 密钥的差异,以及 SSH 代理转发带来的安全影响。
公钥认证与代理转发 是 CoddyKit 上的免费 Cryptology Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cryptology Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cryptology Academy 课程共包含 4 节课。
authorized_keys 文件格式
SSH 公钥身份验证依赖 authorized_keys 文件,该文件通常位于服务器上的 ~/.ssh/authorized_keys。每一行都包含以下格式的公钥:algorithm base64-key comment。服务器会通过签名挑战来检查客户端是否能够证明其持有相匹配的私钥。
使用 ssh-keygen 生成 SSH 密钥
ssh-keygen 命令会创建用于身份验证的密钥对。运行 ssh-keygen -t ed25519 可生成现代的 Ed25519 密钥对。您可以使用 -C 指定注释以便识别,例如填写您的电子邮件地址。默认情况下,该工具会将私钥(id_ed25519)和公钥(id_ed25519.pub)保存到 ~/.ssh 中。
密钥类型比较:RSA、ECDSA、Ed25519
4096 位 RSA 密钥与旧版系统的兼容性很高,但签名速度较慢。基于 NIST P-256 的 ECDSA 速度更快,生成的签名也更短,但一些密码学家对 NIST 曲线参数的选择持质疑态度。基于 Curve25519 的 Ed25519 是当前的最佳实践:速度快,密钥和签名短小,没有已知弱点,并且所有现代 SSH 实现都支持它。
受口令短语保护的私钥
私钥文件应使用口令短语进行保护。ssh-keygen 会使用由口令短语派生的密钥(现代密钥使用 bcrypt)来加密私钥,因此窃取文件的攻击者如果没有口令短语就无法使用它。如果不设置口令短语,任何能够访问该文件的人,都可以使用持有相匹配公钥的任意服务器,以您的身份进行身份验证。
用于密钥管理的 ssh-agent
ssh-agent 守护进程会在登录会话期间,将已解密的私钥保存在内存中。您可以使用 ssh-add ~/.ssh/id_ed25519 加载密钥,系统只会提示您输入一次口令短语。之后的 SSH 连接会请求代理为挑战签名,无需再次输入口令短语,在安全性和便利性之间取得平衡。
ssh-agent 如何为挑战签名
当 SSH 服务器发送身份验证挑战时,SSH 客户端会通过 Unix 套接字将签名工作委托给 ssh-agent。代理使用保存在内存中的私钥执行加密签名,并且只返回签名结果。私钥字节永远不会离开代理进程,甚至不会传递给 SSH 客户端本身。
代理转发:能力与风险
代理转发(ForwardAgent yes 或 ssh -A)允许远程 SSH 会话使用您的本地代理进行后续身份验证。这样,您无需将私钥复制到堡垒主机上,就可以通过堡垒主机继续连接其他服务器,非常实用。但是,如果堡垒主机遭到入侵,其上的 root 用户就可以访问您的代理套接字,并以您的身份向任何服务器进行身份验证。
堡垒主机的 ProxyJump 与 ForwardAgent
ProxyJump(ssh -J bastion target)是访问堡垒主机时比 ForwardAgent 更安全的替代方案。它会通过堡垒主机建立 TCP 隧道,而不会将您的代理套接字暴露在那里。目标服务器会接收到来自本地客户端的直接连接,堡垒主机只能转发经过加密的 TCP 字节,无法使用您的凭据。
SSH 证书身份验证
SSH 支持基于证书的身份验证,其中证书颁发机构(CA)会为主机公钥和用户公钥签名。您无需将单独的公钥分发到每台服务器,而只需配置服务器信任您的 CA。经过签名的用户证书即可授予对所有信任该 CA 的服务器的访问权限,证书中还可以嵌入可选的到期时间和主体限制。
使用 ssh-keyscan 批量收集密钥
ssh-keyscan 工具可以连接一个或多个主机,并在不进行身份验证的情况下获取它们的主机公钥。这对于在部署脚本中自动填充 known_hosts 文件非常有用。输出可以直接通过管道写入 known_hosts 文件:ssh-keyscan -H example.com >> ~/.ssh/known_hosts。
密钥身份验证流程摘要
公钥身份验证流程如下:客户端发送公钥,服务器检查 authorized_keys,服务器发送使用会话 ID 签名的挑战,客户端(通过代理)使用私钥为挑战签名,服务器使用存储的公钥验证签名。如果签名有效,身份验证就会成功,整个过程中无需传输任何秘密凭据。
SSH 密钥类型选择
由于速度快、密钥尺寸小且安全性强,当前新部署的最佳实践是哪种 SSH 密钥类型?
公钥身份验证回顾
要点总结:将公钥存储在 authorized_keys 中,使用口令短语保护私钥,使用 ssh-agent 将已解密的密钥保存在内存中,优先选择 Ed25519 密钥类型;访问堡垒主机时使用 ProxyJump 而不是 ForwardAgent,以避免暴露代理套接字;并考虑使用 SSH 证书来实现可扩展的访问管理。
常见问题解答
「公钥认证与代理转发」课时是免费的吗?
是的 — 「公钥认证与代理转发」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cryptology Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cryptology Academy 课程共包含 4 节课。
「公钥认证与代理转发」这节课中我会学到什么?
了解 authorized_keys、Ed25519 与 RSA 密钥的差异,以及 SSH 代理转发带来的安全影响。 你通过在浏览器中直接运行的动手代码来练习 Cryptology Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Cryptology Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Cryptology Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「公钥认证与代理转发」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Cryptology Academy 课中编写并运行代码吗?
能。每节 Cryptology Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。