梗概

  • 客户端用私钥将本次会话与自己的身份进行签名, 服务器使用公钥进行验证
    • 一对公私钥表示一位用户的身份
    • 私钥加密出来的签名数据表示一次会话
      • 会话包含走双方的信息
      • 会话的双方中, 只有用户是固定的, 服务器的身份是不定的

流程

  • 预备步骤,客户端通过ssh-keygen生成自己的公钥和私钥。
  • 第一步,手动将客户端的公钥放入远程服务器的指定位置。
  • 第二步,客户端向服务器发起 SSH 登录的请求。
  • 第三步,服务器收到用户 SSH 登录的请求,发送一些随机数据给用户,要求用户证明自己的身份。
  • 第四步,客户端收到服务器发来的数据,使用私钥对数据进行签名,然后再发还给服务器。
  • 第五步,服务器收到客户端发来的加密签名后,使用对应的公钥解密,然后跟原始数据比较。如果一致,就允许用户登录。

客户端密钥管理

  • SSH客户端会将目标服务器的密钥保存在本地(~/.ssh/known_hosts文件中)
  • 如果目标服务端改变了密钥,则本地也需要相应改变
    • 可以直接删除对应的密钥记录,等服务端重新发放
    • 这是为了防止中间人攻击,确保连接的安全性