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

m4r*_*c0s 3 linux ssh authentication openssh sftp

我最近在某处读到:

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 个阶段进行:

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

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

use*_*686 8

没有“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,这仍然完全相同。