我最近在某处读到:
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 中验证他们的 SFTP 会话(使用他们事先从服务器获得的私钥)?
没有“SFTP 密钥认证”之类的东西,也根本没有“SFTP 密钥”。
SFTP 始终使用标准 SSH 作为传输方式——差异仅在您成功验证后才开始(客户端然后请求交互式会话或“sftp”子系统会话)。换句话说,SFTP 的工作方式与 Git-over-SSH 或 Rsync-over-SSH 完全相同。
最后,SSH 密钥不用于加密;它们都仅用于身份验证(双向)。因此,您阅读和引用的句子在各方面都是虚假的。
然而,有两对用于身份验证的密钥对——一个属于服务器(在安装期间创建),其公钥由客户端验证,另一对属于客户端,其公钥由服务器验证。
SFTP 和交互式 SSH 的总体流程是:
known_hosts
. (签名数据包括之前协商好的会话密钥等参数,防止中间人攻击。)authorized_keys
. (在这个阶段,数据只是一个随机挑战。)客户端甚至可以通过同一连接打开多个会话——支持多路复用的客户端(例如 OpenSSH 或 Tunnelier)将允许您只进行一次身份验证,然后在同一连接上运行多个交互式 shell 和/或 SFTP 传输。
(另外,我很可能会混淆 SSH 的“会话”与“通道”的相对顺序,但至少你有一个粗略的想法。)
请注意,步骤 3 中的客户端可以通过其他方式(例如 Kerberos 或简单密码)验证自身,而不需要使用密钥对。这对于 SFTP 和交互式 SSH 仍然完全相同。