基于 SFTP 密钥的身份验证如何工作?SSH 和 SFTP 密钥之间的区别

基于 SFTP 密钥的身份验证如何工作?SSH 和 SFTP 密钥之间的区别

我最近在某处读到:

SSH 密钥用于加密,而 SFTP 密钥用于身份验证。

假设我们有一台客户端机器C和一台 SFTP 服务器S。为了建立 SSH 连接(使用公钥/私钥),客户端创建密钥对 PU c和 PR c。公钥 PU c被添加到authorized_keys服务器 S 中的文件中,客户端 C 使用其私钥 PR c建立连接。

但是,我读到过,对于 SFTP,密钥对是在服务器中针对用户创建的,并且私钥与客户端共享,以便他们验证 SFTP 连接。 也就是说,服务器 S 创建 PUPR 并将私钥 PR交给客户端 C 来验证他的 SFTP 连接。这种理解正确吗?

如果是,我理解建立 SSH 连接分为 3 个阶段:

  1. 客户端验证服务器(主机密钥检查)。
  2. 生成会话密钥来加密所有通信。
  3. 客户端的身份验证。

客户端如何在步骤 3 中验证他们的 SFTP 会话(使用他们之前从服务器获得的私钥)?

答案1

根本不存在“SFTP 密钥认证”这种东西,也根本不存在“SFTP 密钥”。

SFTP 始终使用标准 SSH 作为传输方式 – 差异才刚刚开始您已成功通过身份验证(客户端随后请求交互式会话或“sftp”子系统会话)。换句话说,SFTP 的工作方式与 Git-over-SSH 或 Rsync-over-SSH 完全相同。

最后,SSH 密钥不是用于加密;所有这些都仅用于身份验证(双向)。因此,您阅读并引用的句子在各个方面都是假的。

那里但是用于身份验证的两个密钥对 - 一个属于服务器(安装期间创建),其公钥由客户端验证;另一个属于客户端,其公钥由服务器验证。

SFTP 和交互式 SSH 的总体过程是:

  1. 会话密钥交换:客户端和服务器使用(通常)Diffie-Hellman 来协商对称加密密钥。
  2. 主机密钥检查:服务器使用其私钥对某些数据进行签名,然后客户端根据其密钥对这些数据进行验证,从而验证自身身份known_hosts。(签名的数据包括先前协商的会话密钥和其他参数,可防止中间人攻击。)
  3. 用户身份验证:客户端使用其私钥对某些数据进行签名,然后服务器根据其私钥进行验证,从而进行身份验证authorized_keys。(在此阶段,数据只是一个随机质询。)
  4. 会话设置:客户端打开几个通道与服务器交互(例如“代理转发”通道、“TCP 转发”通道、“交互式 shell 会话”通道、“非交互式 shell 命令”通道或“sftp 子系统”通道)。

客户端甚至可以通过同一个连接打开多个会话 - 支持多路复用的客户端(如 OpenSSH 或 Tunnelier)将允许您只进行一次身份验证,然后通过同一个连接运行多个交互式 shell 和/或 SFTP 传输。

(另外,我非常可能会混淆 SSH“会话”与“通道”的相对顺序,但至少您可以大致了解。)

请注意,步骤 3 中的客户端可以使用其他方式(例如 Kerberos 或简单密码)进行身份验证,而不必使用密钥对。这对于 SFTP 和交互式 SSH 来说仍然完全相同。

相关内容