ssh - 为什么 SFTP 客户端只需要知道私钥,不需要公钥?

标签 ssh sftp

当我从客户端连接 SFTP 服务器时,我只需要向客户端软件提供私钥,而不是公钥。我不知道这是如何工作的,因为从 [1] 和 [2] 开始,都需要客户端软件也知道公钥。

我对 SFTP 工作原理的理解是

设置

  • 客户端:生成私钥/公钥对。
  • 客户端:发送公钥到服务器
  • 服务器:将此公钥添加到其授权 key 列表

  • 连接期间
  • 客户端:告诉服务器公钥
  • 服务器:检查公钥是否被授权,如果没有,则拒绝,否则,向客户端发送随机 session ID
  • 客户端:客户端使用私钥对随机 session ID进行编码并发送到服务器
  • 服务器:通过公钥解码并确认身份。

  • 在这种情况下,客户端需要公钥。但是,我没有提供这个,但 SFTP 客户端仍然能够连接服务器。那么这个 SFTP 协议(protocol)究竟是如何工作的呢?

    [1] http://www.openssh.org/txt/rfc4252.txt

    [2] https://www.eldos.com/security/articles/1962.php

    最佳答案

    虽然@Pascal Cuoq 的评论是正确答案,但它只是答案的一半,因为实际上,客户端确实需要一个公钥 - 但只需要服务器的公钥,而您的 known_hosts 中已经有了它。文件。

    如果您不这样做 - 您会被要求信任服务器在您第一次连接到服务器时呈现的那个。这是大多数人完全忽略的事情。如果您在第一次连接期间被 DNS 中毒(或正在进行某种其他形式的中间人攻击) - 或者不注意 Server identity has changed通知 - 您容易受到中间人攻击。

    关于ssh - 为什么 SFTP 客户端只需要知道私钥,不需要公钥?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18667218/

    相关文章:

    git - 推送到 github 或从 github pull 时,无法停止提示输入 ssh key 密码

    c# - 如何通过SSH正确运行 “top”命令?

    git - 如何从命令行使用 'git pull'?

    configuration - 如何修复在 gitlab 中创建新仓库后给出的 URL?

    java - 当 key 加密时如何使用 Java 和 JSch 连接到远程 SSH 机器

    bash - 在脚本内的ssh上捕获bash脚本的输出

    Azure 数据工厂复制数据 SFTP

    ftp - 用于下载、重命名和移动文件的 WinSCP 脚本

    java - 如何使用guacamole进行sftp二次开发

    java - Spring Integration DSL SFTP 良好实践