我最近在某处读到:
SSH 密钥用于加密,而 SFTP 密钥用于身份验证。
假设我们有一台客户端机器C
和一台 SFTP 服务器S
。为了建立 SSH 连接(使用公钥/私钥),客户端创建密钥对 PU c和 PR c。公钥 PU c被添加到authorized_keys
服务器 S 中的文件中,客户端 C 使用其私钥 PR c建立连接。
但是,我读到过,对于 SFTP,密钥对是在服务器中针对用户创建的,并且私钥与客户端共享,以便他们验证 SFTP 连接。 也就是说,服务器 S 创建 PU和PR ,并将私钥 PR交给客户端 C 来验证他的 SFTP 连接。这种理解正确吗?
如果是,我理解建立 SSH 连接分为 3 个阶段:
- 客户端验证服务器(主机密钥检查)。
- 生成会话密钥来加密所有通信。
- 客户端的身份验证。
客户端如何在步骤 3 中验证他们的 SFTP 会话(使用他们之前从服务器获得的私钥)?
答案1
根本不存在“SFTP 密钥认证”这种东西,也根本不存在“SFTP 密钥”。
SFTP 始终使用标准 SSH 作为传输方式 – 差异才刚刚开始后您已成功通过身份验证(客户端随后请求交互式会话或“sftp”子系统会话)。换句话说,SFTP 的工作方式与 Git-over-SSH 或 Rsync-over-SSH 完全相同。
最后,SSH 密钥不是用于加密;所有这些都仅用于身份验证(双向)。因此,您阅读并引用的句子在各个方面都是假的。
那里是但是用于身份验证的两个密钥对 - 一个属于服务器(安装期间创建),其公钥由客户端验证;另一个属于客户端,其公钥由服务器验证。
SFTP 和交互式 SSH 的总体过程是:
- 会话密钥交换:客户端和服务器使用(通常)Diffie-Hellman 来协商对称加密密钥。
- 主机密钥检查:服务器使用其私钥对某些数据进行签名,然后客户端根据其密钥对这些数据进行验证,从而验证自身身份
known_hosts
。(签名的数据包括先前协商的会话密钥和其他参数,可防止中间人攻击。) - 用户身份验证:客户端使用其私钥对某些数据进行签名,然后服务器根据其私钥进行验证,从而进行身份验证
authorized_keys
。(在此阶段,数据只是一个随机质询。) - 会话设置:客户端打开几个通道与服务器交互(例如“代理转发”通道、“TCP 转发”通道、“交互式 shell 会话”通道、“非交互式 shell 命令”通道或“sftp 子系统”通道)。
客户端甚至可以通过同一个连接打开多个会话 - 支持多路复用的客户端(如 OpenSSH 或 Tunnelier)将允许您只进行一次身份验证,然后通过同一个连接运行多个交互式 shell 和/或 SFTP 传输。
(另外,我非常可能会混淆 SSH“会话”与“通道”的相对顺序,但至少您可以大致了解。)
请注意,步骤 3 中的客户端可以使用其他方式(例如 Kerberos 或简单密码)进行身份验证,而不必使用密钥对。这对于 SFTP 和交互式 SSH 来说仍然完全相同。